java中的反射机制

定义:

         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类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值