java反射

package com.cnpc.reflect;

public class Car {

	private String brand;
	private String color;
	private int maxSpeed;

	public Car() {
	}

	public Car(String brand, String color, int maxSpeed) {
		super();
		this.brand = brand;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}

	public void introduce() {
		System.out.println("brand:" + brand + ",color:" + color + ",maxSpeed:"
				+ maxSpeed);
	}

	public String getBrand() {
		return brand;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public int getMaxSpeed() {
		return maxSpeed;
	}

	public void setMaxSpeed(int maxSpeed) {
		this.maxSpeed = maxSpeed;
	}

}


package com.cnpc.reflect;

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

public class ReflectTest {

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static Car initByDefaultConst() throws Throwable {
		// 通过类装载器获取Car类对象
		ClassLoader loader = Thread.currentThread().getContextClassLoader();
		Class clazz = loader.loadClass("com.cnpc.reflect.Car");

		// 获取类的默认构造器对象并通过它实例化Car
		Constructor cons = clazz.getDeclaredConstructor((Class[]) null);
		Car car = (Car) cons.newInstance();

		// 通过反射方法设置属性
		Method setBrand = clazz.getMethod("setBrand", String.class);
		setBrand.invoke(car, "红旗CA72");
		Method setColor = clazz.getMethod("setColor", String.class);
		setColor.invoke(car, "黑色");
		Method setMaxSpeed = clazz.getMethod("setMaxSpeed", int.class);
		setMaxSpeed.invoke(car, 200);
		return car;
	}

	public static void main(String[] args) throws Throwable {
		Car car = initByDefaultConst();
		car.introduce();
	}
}



类装载器ClassLoader
工作机制
类装载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。在java中,类装载器把一个类装入JVM中,具体的步骤:
1>装载:查找和导入Class文件。
2>链接:执行校验,准备和解析步骤,其中解析步骤是可以选择的
        校验--检查载入Class文件数据的正确性
准备--给类的静态变量分配存储空间
解析--将符号引用转成直接引用
3>初始化:对类的静态变量,静态代码块执行初始化工作。
类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入
Class字节码文件。JVM在运行时会产生三个ClassLoader:根装载器,ExtClassLoader扩展类装载器和AppClassLoader系统类装载器。
其中,根装载器不是ClassLoader的子类,它是使用C++编写,因此我们在Java中看不到它,根装载器负责JRE的核心类库。
ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包
AppClassLoader负责装载Classpath路径下的类包。


JVM类装载是使用的 全盘负责委托机制。
全盘负责--当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader装入。
委托机制--先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径下查找并装载目标类。(为了安全)


私有属性和方法的访问 -- 取消java语言访问检查以访问private 和  protected方法
xxx.setAccessible(true);

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值