反射(reflect)

反射(reflect)

什么是反射机制?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法,这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制,简单来说, 就可以把.class文件比做动物的尸体, 而反射技术就是对尸体的一种解剖。

作用:
通过反射技术, 我们可以拿到该字节码文件中所有的东西, 例如成员变量, 成员方法, 构造方法, 而且还包括私有。

字节码文件获取的三种方式:

  1.   Class c1=class.forName(包名+类名);
    
  2.   Class c2=new Peson().getClass();
    
  3.   Class c3=Person.class;
    

- 通过Class类创建对象和获取:

一,创建对象:
1.通过无参构造方法:

String className="cn.java.reflect.Person";
Class ob = Class.forName(className);
Person p = (Person)ob.newInstance();

2.通过有参构造方法创建对象:

tring className= "cn.java.reflect.Person";
Class ob = Class.forName(className);
Constructor[] cst = ob.getConstructors();
Person  p =(Person)cst[0].newInstance("huairen");

二、获得
1.取得类的结构:
String className= “cn.java.reflect.Person”;
Class ob = Class.forName(className);

2.取得全部实现的接口:
ob.getInterfaces Class[] inter = ob.getInterfaces();
for(int i=0;i<inter.length;i++){System.out.println(inter[i]);}

3.取得父类:
Class superClass = ob.getSuperclass();
System.out.println(superClass);

4.取得全部构造方法:

Constructor[] cs = ob.getConstructors();
for(int i=0;i<cs.length;i++){
	System.out.println(cs[i]);
}

取出构造方法的形参:

for(int i=0;i<cs.length;i++){
                Class[] pr =cs[i].getParameterTypes();
                for(int j=0;j<pr.length;j++){
                         System.out.println(pr[j]);
                }
       }

取出构造方法的权限:

for(int i=0;i<cs.length;i++){
	int md =cs[i].getModifiers();
	System.out.println(Modifier.toString(md));
}//将数字1还原为public

取得构造方法名:

System.out.println(cs[0].getName());

5.取得全部方法:]

Method[] mthd = ob.getMethods();

获得方法的形参类型:

Class[] pa =mthd[i].getParameterTypes();
for(int j=0;j<pa.length;j++){
     System.out.println(pa[j]);
}

获得方法名字:

 String name = mthd[i].getName();

获得属性:

Field[] f = ob.getDeclaredFields();

6.通过反射调用类中的方法
没有参数的情况下:

Method mth = ob.getDeclaredMethod("say");	
mth.invoke(ob.newInstance());

有参数的情况下:

Method mth = ob.getDeclaredMethod("say",String.class,int.class);
mth.invoke(ob.newInstance(),"张三",80);

7.修改属性:

Class<?> c =Class.forName("cn.java.reflect.Person");
Constructor<?>[] cst = c.getConstructors();
Person p = (Person) cst[1].newInstance("张三",3);
Field f =c.getDeclaredField("name");
f.setAccessible(true);
f.set(p, "wowo");
System.out.print(f.get(p));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值