18.反射机制

1.概述&应用场景

          a.概述:JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息及动态调用对象的方法的功能称为JAVA语言的反射机制。

          b.应用场景

图示:


2.Class对象

          概述:在JAVA中,每个class都有相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的 .class文件中,就会产生一个Class对象,用于表示这个类的类型信息。

图示:


3.获取Class对象的三种方式

代码示例:

package test;

import java.text.DateFormat.Field;

/*
 * 要想对字节码文件进行解剖,必须要有字节码文件对象
 * 如何获取字节码文件对象呢?
 */

public class ReflectDemo {

	public static void main(String[] args) throws ClassNotFoundException {
//		getClassObject_1();
//		getClassObjects_2();
		getClassObject_3();
	}
	
	//方式1.Object类中的getClass()方法
		//这种方式必须要明确具体的类,并创建对象
	public static void getClassObject_1() {
		Person p = new Person(50,"xiaoqiang");
		Class clazz = p.getClass();
		
		Person p1 = new Person(30,"lili");
		Class clazz1 = p1.getClass();
		
		System.out.println(clazz==clazz1);
	}
	
	//方式2.任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
		//相对简单,但是还是要明确具体用到类中的静态成员	
	public static void getClassObject_2() {
		Class clazz = Person.class;
		Class clazz1 = Person.class;
		
		System.out.println(clazz==clazz1);
	}
	
	//方式3.只要通过给定的类的 字符串名称就可以获取该类,更为扩展
		//可以用Class类中的方法完成 forName()
		//这种方式只要有名称就可,更方便,扩展性更强
	public static void getClassObject_3() throws ClassNotFoundException {
		String className = "test.Person";
		Class clazz = Class.forName(className);
		System.out.println(clazz);
	}
}

4.获取Class中的构造函数

代码示例:

	public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		String name = "test.Person";
		//找寻该名称类文件,并加载进内存,并产生Class对象
		Class clazz = Class.forName(name);
		
		
		//调用newInstance()方法产生该类的对象
//		Object obj = clazz.newInstance();
		
		
		//获取到了指定的构造函数对象
		Constructor constructor = clazz.getConstructor(String.class,int.class);
		//通过该构造器对象的newInstance方法进行对象的初始化
		Object obj =  constructor.newInstance(30,"xiaoming");
	}

5.获取Class中的字段

代码示例:

		Class clazz = Class.forName("test.Person");
		
		Field field = clazz.getField("age");//只能获取公有的
		
		field = clazz.getDeclaredField("age");//只能获取本类,但包含私有
		
		//对私有字段的访问取消权限检查,强制访问
		field.setAccessible(true);
		
		Object obj = clazz.newInstance();
		
		Object o = field.get(obj);
		
		System.out.println(o);
		
		System.out.println(field);

6.获取Class中的方法

代码示例:

		Class clazz = Class.forName("test.Person");
		
		//获取指定Class中的公共函数
		Method[] methods = clazz.getMethods();
		
		//只获取本类中所有方法,包含私有
		methods = clazz.getDeclaredMethods();
		
		for(Method method : methods) {
			System.out.println(method);
		}
		
		//获取空参数一般方法
		Method method = clazz.getMethod("show",null);
//		Object obj = clazz.newInstance();
		Constructor constructor = clazz.getConstructor(String.class,int.class);
		Object obj = constructor.newInstance("小明",37);
		method.invoke(obj, null);
		
		//获取带参数的一般方法
		Method method1 = clazz.getMethod("paramMethod",String.class,int.class);
		Object obj1 = clazz.newInstance();
		method.invoke(obj,"小强",20);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值