JAVA反射

一.反射使用

背景:不同于正常new对象,反的含义在于基于类的字符串实例化对象,并且调用对象的方法。使用jdk提供的反射API进行实例化对象(获取反射的 Class 对象、通过反射创建类对象、通过反射获取类属性方法及构造器)

正常使用:

Apple apple = new Apple(); 
apple.setPrice(4);

反射使用:

Class clz = Class.forName("com.chenshuyi.reflect.Apple");
Method method = clz.getMethod("setPrice", int.class);
Constructor constructor = clz.getConstructor();
Object object = constructor.newInstance();
method.invoke(object, 4);

反射常用API

--------获取类------------------------------------------
1.知道类全路径
Class clz = Class.forname("java.lang.String");

2.已知操作的类
Class clz = String.class;

3.对象获取类
String str = new String("aaa");
Class clz = str.getClass();

-------实例化对象---------------------------------------
1.使用类默认无参构造方法
Class clz = Car.class;
Car ob = (Car)clz.newInstance();

2.使用特定的构造函数
Class clz = Car.class;
Constructor con = clz.getConstructor(String.class,int.class)
Car ob = (Car)con.newInstance("bmw",30);

-------获取方法和属性及其调用----------------------------------
//实例化对象
Class clz = Class.forName("main.up.reflect.Car");
Constructor con = clz.getConstructor(String.class);
Object object = con.newInstance("bmw");

//获取字段信息
Field[] fields = clz.getDeclaredFields();
for (Field ob : fields)
{
    // System.out.println("fild:" + ob.toString());
}

//获取public方法信息
Method[] method = clz.getMethods();
for (Method ob : method)
{
    // System.out.println("method:" + ob.toString());
}

//调用方法
Method setColor = clz.getMethod("setColor", String.class);
setColor.invoke(object, "yellow");

//获取所有方法,包括private
Method setMoney = clz.getDeclaredMethod("setMoney", int.class);

//暴力反射调用private方法
setMoney.setAccessible(true);
setMoney.invoke(object, 30);

Method print = clz.getMethod("printString", String.class);
print.invoke(object, "|");

 

类加载过程:

1.1、加载:查找并加载类的二进制数据
1.2、验证:确保被加载的类的正确性
1.3、准备:为类的静态变量分配内存,并将其初始化为默认值
1.4、解析:把类中的符号引用转换为直接引用
1.5、初始化,为类的静态变量赋予正确的初始值
1.6、使用:主动使用和被动使用
1.7、卸载:满足条件后,被GC回收
 

2、ClassLoader的加载原理
ClassLoader使用的是双亲委托模型来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),当父亲已经加载了该类的时候,子ClassLoader不再加载,避免了重复加载。
双亲委派模型的工作工程:当一个类加载器收到一个类加载请求时,它首先不会先去加载这个类,而是把这个请求委托给父加载器,每一层的加载器都是如此,所以最终所有的加载请求都会传送到最上层的启动加载器。只有当父加载器反馈自己无法完成加载请求(它管理的范围之中没有这个类),子加载器才会尝试自己去加载。
 

 JVM详解链接

反射:JDK到JVM

 

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值