反射

反射




第一步:先创建一个字节码文件,
创建字节码有三种方法:1.类名.class
 2.变量.getClass()
 3.Class.forName(“权限定类类名”)
如:Class clazz = Class.forName(“权限定类类名”);
第二步:创建对象,在创建对象之前,要先拿到构造,然后在创建对象
创建构造:
没有被私有化,公共的:Constructor c = clazz.getConstructor();
被私有化:Constructor c =  clazz.getDeclaredConstructor();
被私有化后要使用暴力访问:c.setAccessible(true);
第三步:创建对象: Object obi = Clazz.newInstanse(无参不写任何东西,有参写相对应的);
第四步:获取成员变量:获取字段相应的Field f= clazz.getField(“name”);
如果要修改内容要使用f.set( , );
 被私有化要使用:Field f = clazz.getDeclaredField(“name”);
去除私有权限:f.setAccessible(true);
第五步:获取方法:
无参获取eat 方法:Method m = clazz.Method(“eat”);执行m.invoke(obj);
有参获取eat 方法:Method m = clazz.Method(“eat”,int.class);
执行m.invoke(obj,10 );



import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;


public class Demo01 {


public static void main(String[] args) throws Exception {
//创建字节码文件
Class clazz = Class.forName("day01.Person");
//先创建对象,要通过拿到构造方法Conctrustor
Constructor s =clazz.getConstructor(String.class,int.class);
//然后在创建对象
Object obj = s.newInstance("哈看见过",77);
System.out.println(obj);
//访问的字段
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);
f.set(obj, "jih");
System.out.println(obj);
//无参
Method m = clazz.getMethod("eat");
m.invoke(obj);
//有参
Method m1 = clazz.getMethod("eat", int.class);
m1.invoke(obj, 10);
}
}


package day01;


public class Person {
private String name;
private int age;
//无参
public Person() {
super();
// TODO Auto-generated constructor stub
}

        //有参
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}

//get,set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

//ToString方法
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}

//方法
public void eat(){
System.out.println("开饭了");
}
public void eat(int number){
System.out.println("我要吃"+number+"个");
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值