Java反射

目录

 

反射简介

反射原理

使用反射


反射简介

反射就是可以通过一些方法得到一个类,进而得到这个类中的所有方法,属性。要想获得一个类,必须先要获取到该类的字节码文件对象。而获得类使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

class对象是class文件读入内存是jvm自动创建的。class对象中一般存方法名,属性名,方法属性地址等信息。


反射原理

  • 首先将java文件保存在硬盘上

  • 编译java文件,生成.class文件

  • 将.class文件用类加载器加载到内存中

  • 反射就是通过.class文件反向获得类的相关信息

  • 成员变量,方法,构造方法等也被封装成类

  • 成员变量通过类Field


使用反射

首先创建一个class文件保存

public class ReflectDemo {
	
	//成员变量
	public String name;
	public int id;
	//有参构造方法
	public ReflectDemo(String name, int id) {
		
		this.name = name;
		this.id = id;
	}
	//无参构造方法
	public ReflectDemo() {
		
	}
	//一般方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	
		
}

再创建一个操作类

public class UseReflectDemo {
	/*
	 * 获取class类对象的三种方法
	 * (1)类名.class
	 * (2)对象.getclass()
	 * (3)Class.forName(className)  参数:包名.类名
	 *
	 *
	 *调用构造方法
	 *	Class类对象.getConstructor(parameterTypes)  参数:参数类型.class
		Class类对象.getConstructors()  获得构造方法数组
		
	 */
	public static void main(String[] args) throws Exception {
		Class c1 = ReflectDemo.class;
		Class c2 = new ReflectDemo().getClass();
		Class c3 = Class.forName("JdkTest.ReflectDemo");

		
		//获得构造方法对象 
		Constructor gc = c3.getConstructor(String.class,int.class);
		//获得ReflectDemo 对象,并创建有参对象
		ReflectDemo rd2 = (ReflectDemo) gc.newInstance("abc",100);
		System.out.println(rd2.getName()+" "+rd2.getId());
		
		
		
	}
	/*
	 * 获取类方法
	 * 		Class类对象.getDeclaredMethod(name, parameterTypes):获取一个方法
	 * 		Class类对象.getDeclaredMethods():返回一个参数数组
	 * 		
	 */
	@Test
	public void test() throws ClassNotFoundException, Exception, Exception{
		//获取class类对象
		Class c4 = Class.forName("JdkTest.ReflectDemo");
		//获取ReflectDemo对象
		ReflectDemo rd4 = (ReflectDemo) c4.newInstance();
		//获取方法对象
		Method m4 = c4.getDeclaredMethod("getName",null);
		Method m5 = c4.getDeclaredMethod("setName", String.class);
		//m5.invoke(obj, args) 调用该方法 参数:(1)obj:方法对象(2)args:实参
		m5.invoke(rd4, "String");
		
		System.out.println(rd4.getName());
	}
	/*
	 * 获取类成员变量
	 * 		Class类对象.getDeclaredField(name) 获取一个变量对象
	 * 		Class类对象.getDeclaredFields  获取一个变量对象数组
	 */
	@Test
	public void test1() throws Exception{
		//获得class类对象
		Class c5 = Class.forName("JdkTest.ReflectDemo");
		//获得成员变量对象
		Field f1 = c5.getDeclaredField("name");
		//获得ReflectDemo 对象
		ReflectDemo rd5 = (ReflectDemo) c5.newInstance();
		//set方法设置成员变量值  参数:(1)obj:操作的对象  (2)value:值
		f1.set(rd5,"ReflectDemo");
		System.out.println(rd5.getName());
		
		
		
		
	}
	
	
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值