标签:
java反射机制是在运行过程中,对于任意类,都可得知这个类的全部属性和方法(不论公有与私有),且可以任意调用它的任意方法,动态获取信息和动态调用对象方法。
反射机制与对象之间的关系如下图所示:
Class类用于定义类对象的属性和方法。
1.Object类中的getClass方法
2.类.class
3.通过Class类的forName方法
1.创建对象
2.可以获取类属性
3.可以获取类方法
1.Class实例化对象:public T newInstance();执行无参构造方法实例化。
2.获取构造方法(运用Constructor类):
public Constructor<T>getConstructor(Class<?>... parameterTypes)
获取类的公有构造方法
public Constructor<?>[]getConstructors()
获取类的所有公有构造方法
public Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes)
获取类的构造方法
public Constructor<?>[]getDeclaredConstructors()
获取类的所有构造方法
3.获取普通方法(运用Method类):
public Method getMethod(Stringname,Class<?>... parameterTypes)
获取公有普通方法
public Method[] getMethods()
获取所有公有的普通方法
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
获取普通方法
public Method[] getDeclaredMethods()
获取所有普通方法
4.获取属性的方法(Field类):
public Field getField(String name)
获取公有属性
public Field[] getFields()
获取所有公有属性
public Field getDeclaredField(String name)
获取属性
public Field[] getDeclaredFields()
获取所有属性
创建一个对象,获取Class反射对象,输出比较结果:
/**********************创建对象获取Class反射对象***********************/ Student stu = new Student(); Student stu1 = new Student(); Class stuClass = stu.getClass();//用对象.getClass获取Student类的反射对象 Class stuClass1 = Student.class;//用类名.class获取Student类的反射对象 Class stuClass2 = Class.forName("反射.Student");//用Class.forName(包名.类名)获取反射对象 System.out.println(stuClass == stuClass1); System.out.println(stuClass == stuClass2);
结果向我们表示,Class类反射的是同一个对象:
通过反射来调用类的构造方法:
/************************通过Class反射创建对象*****************************/ Student stuInstance = (Student) stuClass.newInstance(); System.out.println(stuInstance);
打印输出对象名,调用的是toString()方法,我们通过重写toString()方法可以,修改打印对象名的输出
如下图所示:
通过Class获取所有的构造函数,并且通过Class的反射调用有参构造函数去创建一个对象,传入字符串Long,打印输出。
/************************通过Class获取所有构造函数********************************/ Constructor[] constructors = stuClass.getDeclaredConstructors(); for (int i = 0; i < constructors.length; i++) { System.out.println(constructors[i].getName()+" " +Modifier.toString(constructors[i].getModifiers())); } Constructor constructor = stuClass.getDeclaredConstructor(String.class); Student student = (Student) constructor.newInstance("Long"); System.out.println(student);
代码测试与输出结果如下图:
通过Class类获取所有普通函数名,并且调用。
/************************通过Class获取Student所有普通函数************************/ Method[] methods = stuClass.getDeclaredMethods();//获取Student里面所有普通方法 for (Method method2 : methods) { System.out.println(method2);//循环迭代 } Method method = stuClass.getDeclaredMethod("study", java.lang.String.class); method.invoke(student, "Long1");//调用公有方法 Method primethod = stuClass.getDeclaredMethod("play"); primethod.setAccessible(true); primethod.invoke(student);
只要再调用之前加上一句:
primethod.setAccessible(true);
就可以了,代码意思是设置方法调用不检测访问权限,结果如下图,可以调用私有方法:
通过Class反射获取对象的全部属性,并且赋予新值。
/*********************通过Class反射获取全部属性********************/ Field[] fields = stuClass.getFields(); for (Field field : fields) { System.out.println(field);//遍历field获取stuClass里的所有属性 } Field field = stuClass.getDeclaredField("name");//获取反射属性 field.set(student, "Long2");//为对象的属性赋值 System.out.println("赋值后的新属性: "+field.get(student));//输出属性值 Field field1 = stuClass.getDeclaredField("age"); field1.set(student, 20); System.out.println("赋值后的新属性: "+field1.get(student));
public int getModifiers()
public Annotation[]getAnnotations()
public ClassLoadergetClassLoader()
public Class<?>[]getInterfaces()
public String getName()
public boolean isAnnotation()
public boolean isEnum()
public boolean isInterface()
标签:
原文地址:http://blog.csdn.net/jjfly999/article/details/51226986