Java反射机制

作者:李永健
撰写时间:2019年 08月17日
开发工具与关键技术:MyEclipse10,java

在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意 一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态 获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲, 通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。

例子:

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

import com.gx.math.Person;
import com.gx.math.ReflectDemo1;

public class jian16 {
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,	SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, //抛异常
	InvocationTargetException, NoSuchFieldException {
		//加载类四种方法 获取类
		Class<?> class1=ReflectDemo1.class.getClassLoader().loadClass("com.gx.math.Person");
		Class<?> class2=Class.forName("com.gx.math.Person");
		Class<?> class3=Person.class;
		Class<?> class4=new Person("", 1).getClass();

		//-----------通过反射机制调用构造器实例化一个类的对象--------
		/*
	     * 构造器实例化一个类的对象
* 调用我getDeclaredConstructor 或者  getConstructor(只能访问类中声明为公有的构造器)
	     * 		参数 :[参数类型1,参数类型2,...]
	     * 
* 无法直接访问的构造器不一定是私有  设置允许访问 constructor.setAccessible(true)
	     * newInstance


	     *///公用调用构造器
		System.out.println("----通过反射机制调用构造器实例化一个类的对象----");
//(形参列表) 公用构造器
Constructor<?>  constructor1=class2.getConstructor(String.class,int.class);
//创建实例化赋值
Person person=(Person) constructor1.newInstance("小明",20); 
//取对象值打印
		System.out.println(person.getName()+" "+person.getAge());
		//全部包括私有
        //私用的构造器
		Constructor<?> constructor2=class2.getDeclaredConstructor();		 constructor2.setAccessible(true);//打破封装
		Person person2=(Person) constructor2.newInstance();//创建实例化
		person2.setName("小王");//赋值
		person2.setAge(20);
		System.out.println(person2.getName()+" "+person2.getAge());
		
		//-----------通过反射机制调用普通方法--------
		/*
	     * 普通方法
	     * 调用我getDeclaredMethod 或者getMethod(只能访问类中声明为公有的方法)
	     * 		参数 :方法名, [参数类型1,参数类型2,...]
	     * 
	     * 无法直接访问的方法不一定是私有  设置允许访问 method.setAccessible(true)
	     * method.invoke(对象,[参数1,参数2,....] );
	     */
		System.out.println("-----------通过反射机制调用普通方法--------");
		//可以访问指定名称和参数类型的方法对象
		Method method = class2.getMethod("say", String.class);//(方法名称,形参列表)
		String str=  (String) method.invoke(person, "可以访问的方法");//执行这对象person,参数值
		System.out.println(str);
		
		//调用无法直接访问的方法
		System.out.println("----调用无法直接访问的方法--------");
		Method method2=class2.getDeclaredMethod("test");
		method2.setAccessible(true);
		method2.invoke(person);//直接调用test方法
		
		//-----------通过反射机制获取或者设置成员变量--------
		/*
	     * 成员变量
	   * 调用我getDeclaredField 或者  getField(只能访问类中声明为公有的成员变量)
	     * 		参数 :变量名称
	     * 无法直接访问的成员变量不一定是私有  field.setAccessible(true);
	     * 
	     * 取值 field.get(对象)
	     * 赋值 field.set(对象,值)
	     */
		System.out.println("-------通过反射机制获取或者设置成员变量-----");
		//设置值
		Field field=class2.getDeclaredField("name");
		field.setAccessible(true);
		field.set(person, "小小明");//那个对象  , 设置name值
		System.out.println(person.say("111111"));
		//获取值
		System.out.println(field.get(person));
	}
}

结果图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值