1. 反射机制(reflection)的功能是在运行时环境中,动态获取类的信息以及动态调用对象的方法。
2. Java语言反射机制提供的功能
1) 在运行时判断任意一个对象所属的类
2) 在运行时构造任意一个类的对象
3) 在运行时判断任意一个类所具有的成员变量和方法
4) 在运行时调用任意一个对象的方法。
3. Reflection是java被视为动态(或准动态)语言的一个关键性质,这个机制云逊程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括modifiers、superclass、实现的interfaces,也包括fields和method的所有信息,并可与运行时该i安fields内容或调用methods。
4. 一般而言,开发者社群说到动态语言,大致认同的定义是:“程序运行时,允许改变程序结构和变量类型,这种语言成为动态语言”,从此观点看,Perl、Python、Ruby,是动态语言(开发人员普遍认为,学习静态语言,最好掌握一一门动态语言,如Python),c++,java,c#不是动态语言。尽管在此分类下java不是动态语言,但反射机制却实现了非常突出的动态功能。
5. 要想使用反射,首先需要获得待处理类或对象所对应的Class对象。
6. 若想通过类的不带参数的构造方法生成对象,有两种方式
a) 先获得Class对象,然后通过该Class对象的newinstance()方法直接生成即可:
Class<?> classType = String.class;
Object obj = classType.newinstance();
b) 先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newinstance()方法生成:
Class<?> classType = String.class;
Constructor cons = classType.getConstructor(new Class[]{});
Object obj = cons.newinstance(new Object[]{});
若想通过类的带参数的构造方法生辰对象,只能使用下面一种方式:
Class<?> classType = String.class;
Constructor cons = classType.getConstructor(String.class);
7. Object obj = cons.newinstance(new Object[]{“hello”});
8. 获取某个类或对象所对应的Class对象的常用的3种方式:
a) Class<?> classType = Class.forName(“java.lang.String”);//使用java.lang.Class类的静态方法forName获得Class对象
b) Object str = String.class;//使用类的.clsss语言获得
c) String srtr = “aa”;Class<?> cla = s.getClass();//使用对象的getClass()方法
9. 反射机制应用实例:
package com.reflection;
importjava.lang.reflect.Method;
publicclassReflectionTest
{
public int add(int a, int b)
{
return a+b;
}
public static void main(String[] args) throws Exception
{
Class<?> reflect = ReflectionTest.class;
Object reflectionTest = reflect.newInstance();
Method addMethod = reflect.getMethod("add", int.class,int.class);
Integer result = (Integer)addMethod.invoke(reflectionTest, 2,3);
System.out.println(result);
}
}
10. 适用反射机制,破坏性的访问类的私有成员变量。
package com.reflection;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Private
{
public static void main(String[] args) throws Exception
{
Private1 pr = new Private1();
Class<?> classType = pr.getClass();
Field field = classType.getDeclaredField("name");
String getMethod= "get" + field.getName().substring(0,1).toUpperCase() + field.getName().substring(1,field.getName().length());
Method method = classType.getMethod(getMethod, new Class[]{});
field.setAccessible(true);
field.set(pr, "lisi");
String name = (String)method.invoke(pr, new Object[]{});
System.out.println(name);
}
}
class Private1
{
private String name = "zhangsan";
public String getName()
{
return name;
}
}