@Cesar
2017-10-31T02:22:17.000000Z
字数 2307
阅读 1451
Java 学习JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java中有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象。Class对象十分特殊。他是Java中所有类的实例,借助它可以实现对一个对象的操作。
创建Person类
public class Person {private String name;private String age;private void shot(){System.out.println("!!!");}protected void shot1() {System.out.println("111");}public String getAge() {return age;}public String getName() {return name;}public void setAge(String age) {this.age = age;}public void setName(String name) {this.name = name;}}
通过getClass()
Person person = new Person();Class<?> class2 = person.getClass();
通过Class.forName()
Class<?> class1 = Class.forName("test0118.testR.Person");
.class
Class<?> class3 = Person.class;
获取类的属性
Field[] fields = class1.getDeclaredFields();Field[] fields2 = class1.getFields();for (Field field : fields) {System.out.println(Modifier.toString(field.getModifiers()) + field.getName());}for(Field field:fields2){System.out.println(Modifier.toString(field.getModifiers())+field.getName());//由于Person类中并没有公有字段,所以该循环不输出任何值}/**输出:privatenameprivateage*/
获取类属性的修饰符
上述代码中有一个方法Modifier.toString(field.getModifiers())即是获取该属性的修饰符,field.getModifiers()返回一个int值,将该值转化为对应的描述要用到Modifier.toString()方法。
对类的属性进行操作
Field field = class1.getField("name");Object object = class1.newInstance();field.setAccessible(true);//打破了封装的特性,允许对私有属性直接进行操作field.set(object, "123");System.out.println(field.get(object));
获取类的方法
Method[] methods = class1.getDeclaredMethods();Method[] methods2 = class1.getMethods();
获取方法的参数和返回值的类型
Class<?>[] ty = method.getParameterTypes();Class<?> rty = method.getReturnType();
使用反射调用方法
Object object = class1.newInstance();Method method = class1.getMethod("setName", Class.forName("java.lang.String"));method.invoke(object, "123123");Method method2 = class1.getMethod("getName");System.out.println((String) method2.invoke(object));System.out.println(method.getReturnType());