定义:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射就是把java中的各种成分映射成相应的java类。
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
Constructor类:
Constructor类代表某个类中的一个构造方法
得到某个类所有的构造方法:
Constructor[] constructor = Class.forName("com.mysql.jdbc.Driver.class").newInstance();
得到某一个构造方法:
Constructor[] constructor = Class.forName("com.mysql.jdbc.Driver.class").newInstance(StringBuffer.class);
创建实例对象:
通常方式:String str = new String(new StringBuffer("aaa"));
反射方式:String str = (String )constructor.newInstance(new StringBuffer("aaa"));
Field类
类的成员变量的反射:
getField()获取成员变量(通过接收一个变量名来进行获取)
getDeclaredField() 获取所有的成员变量(可以获取私有的成员变量)
class ReflectPoint
{
private int x;
public int y;
public ReflectPoint(int x,int y)
{
super();
this.x=s;
this.y=y;
}
}
在通过反射对这个类中的成员变量进行获取时
</pre><pre name="code" class="java"><pre name="code" class="java">ReflectPoint rp=new ReflectPoitn(3,5);
Field fieldY=rp.getClass.getField(“y”);
int yy=fieldY.get(rp);
Field fieldX=rp.getClass.getDeclaredField(“x”);
//仅仅得到了私有变量,但是原来的类并不希望将私有变量暴露出去,要对其进行强制访问,必须要将私有变量设为可访问状态,这种访问称为暴力反射。
fieldX.setAccessible(true);//
int xx=fieldX.get(rp);
Method类
类的成员方法的反射:
获得类方法的方法 Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法 Method[] getMethods()//获得所有的public方法 Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法 Method[] getDeclaredMethods()//获得所以的public和非public方法
String str="abc"<span style="font-family: Arial, Helvetica, sans-serif;">;</span>
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
Method meChar=String.class.getMethod("charAt",int.class);
//调用Method对象的invoke方法来调用Method对象获取的相应的方法。接收一个对象和一个int型数值(因为在获取方法对象时是获取的接收int型参数的方法),同样的,在获取方法时有几种类型,在调用时就需要写几种类型的数据。
System.out.println(meChar.invoke(str1,1));
数组的反射:
具有相同的数组类型和相同的维数,则认为是同一个字节码,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的是父类Object类型对象的class。
基本类型的一维数组,可以被当做Object类型使用,但是不能当做Object[]类型使用,而非基本类型的一维数组,即可以当做Object类型,又可以当做Object[]类型使用。
所以在用数组工具类的方法 Array.asList()将数组转换成集合时,对int[]的转换仍然是引用地址值,这时就把这个数组作为一个Object类型的对象放进了集合中,而并非是数组中的数据;而String类型的数组的转换则是把数组中的字符串作为元素存储到集合中。
java反射机制是一个很好用的东西,用它可以解决很多死的东西,因为反射机制的灵活行很大,总的来说反射也是那句话:反射就是把java中的各种成分映射成相应的java类。