Java反射的简单实现

一.Java的反射机制概述与场景

    JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;

 这种动态互殴的信息以及动态调用对象的方法的功能称为java语言的反射机制

场景:tomcat中服务器web.xml类文件由反射进行加载

二.反射机制细节&class对象

获得字节码对象的几种方式

方式1:使用对象获得 根据被new的累的名称寻找累的字节码文件,并加载进内存,并创建该字节码文件对选哪个,并接着创建盖子接文件的对应的person对象

Person person = new Person();
		Class class1 = person.getClass();

方式2:使用类获得

	Class class3 = Person.class;

方式3:使用名称获得

try {
			Class<?> forName = Class.forName("Person");
			System.out.println(forName);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

三.创建对象

    1.newInstance,相当于调用无参构造方法,注意:当无空参构造方法或者对象为private空参构造时,会报错

Object newInstance = forName.newInstance();

2.获取指定的构造函数

Class<?> forName = Class.forName("Person"); 
			Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
			Object obj = constructor.newInstance(1,"小明");

四.获取属性

    1.获得公有属性

Class<?> forName = Class.forName("Person"); 
			Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
			Object obj = constructor.newInstance(1,"小明");
			Field field = forName.getField("c");
			Object object = field.get(obj);

2.获得私有的属性

Class<?> forName = Class.forName("Person"); 
			Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
			Object obj = constructor.newInstance(1,"小明");
			
			Field declaredField = forName.getDeclaredField("a");
			declaredField.setAccessible(true);
			System.out.println(declaredField.get(obj));

注意:必须要取消权限检查才能访问暴力访问,不建议使用

五.获取方法

1.获得字节对象所有的公有方法名称

Class<?> forName = Class.forName("Person");
			Method[] methods = forName.getMethods();

2.调用方法

Class<?> forName = Class.forName("Person");
			Method method = forName.getMethod("方法名称",null);
			method.invoke("我们的实体类", "参数");

猜你喜欢

转载自blog.csdn.net/afdasfggasdf/article/details/83819768