Java复习笔记_反射_02

2018-3-14


反射获取空参构造方法并运行:


第一步:获取class文件对象
Class c = Person.class;

第二步:从class文件对象中获取类中的构造方法
//Constructor[] constructors = c.getConstructors();//getConstructors()只能获得权限为公有的所有构造器
//获得指定的空参构造器
Constructor con = c.getConstructor();

第三步:运行空参构造
Object object = con.newInstance();
调用子类特有方法需向下转型:
Person p = (Person)object;






反射获取有参构造方法并运行:

第一步:获取class文件对象
Class c = Person.class;


第二步:从class文件对象中获取类中的构造方法
//获得指定的空参构造器
Constructor con = c.getConstructor(String.class,String.class);//参数是对应构造器的参数列表的class文件对象


第三步:运行有参构造
Object object = con2.newInstance("name","dalian");//这里要传运行的实际参数






反射获取构造方法并运行的快捷方式:(前提:被反射的类必须具有空参构造方法,权限必须为public)


第一步:获取class文件对象
Class c = Person.class;


第二步:直接调用Class类中的方法newInstance()
Object object = c.newInstance(); //直接创建被反射类的对象实例






反射获取私有构造方法运行:(破坏了封装性和安全性)


getDeclaredConstructors()可以获取所有的构造方法,包括私有的构造方法


getDeclaredConstructor(可变参数)获得指定参数列表的构造方法


setAccessible(true)取消运行时期的权限检查




反射获取成员变量,并改值:

Class c = Class.forName("com.xiao.reflection.Person");


Field[] fields = c.getFields();//获取所有公共的成员变量


Field[] declaredFields = c.getDeclaredFields();//获取所有成员变量,包括私有


Field field = c.getField("name");//获取指定的公有成员变量


Field declaredField = c.getDeclaredField("name");//获得指定的成员变量,包括私有
Object o  = c.newInstance();
//修改值
declaredField.set(o, "笑笑");//第一个参数是对象,第二个参数是修改后的值




反射获取空参成员发方法,并运行:

Class c = Class.forName("com.xiao.reflection.Person");


Method[] methods = c.getMethods();//获取的是所有公共的成员方法,包括继承的

//调用getMethod(name, parameterTypes)获取指定的成员方法
Method method = c.getMethod("eat");


//调用invoke(obj, args);运行指定方法
Object o = c.newInstance();
method.invoke(o);




反射获取有参成员方法,并运行:

Class c = Class.forName("com.xiao.reflection.Person");

Method method = c.getMethod("sleep", String.class);
Object o = c.newInstance();
method.invoke(o,"笑笑");




泛型擦除:

Java中的泛型是伪泛型,编译后的class文件是没有泛型的




例:加了String泛型的集合 添加整型数据

ArrayList<String> array = new ArrayList<>();
//获取集合ArrayList类的class文件的对象
Class c = array.getClass();
//获取ArrayList.class文件中的方法add
Method method = c.getMethod("add",Object.class);
//添加数据
method.invoke(array, 12);
method.invoke(array, 1222);
method.invoke(array, 1000);
System.out.println(array);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值