菜鸟先飞之JAVA_反射

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Happy_cloudlife/article/details/78271458
反射的概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。
获取Class对象的三种方式:
1、Object类的getClass()方法
2、静态属性class
3、Class类中静态方法forName()方法


Class类中的成员方法
public static Class<?> forName(String className) throws ClassNotFoundException;返回与带有给定字符串名的类或接口相关联的 Class 对象。
public class Demo_Reflect {

	/**
	 * @param args
	 * @throws ClassNotFoundException 
	 * 通过反射获取class对象
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		
		//Object类的getClass方法
		Person p = new Person();
		Class clazz1 = p.getClass();		

		//静态属性class		
		Class clazz2 = Person.class;
		
		//Class类中静态方法forName()方法
		Class clazz1 = Class.forName("java.study.bean.Person");
		
		System.out.println(clazz1 == clazz2);
		System.out.println(clazz2 == clazz3);
	}

}


public T newInstance() throws InstantiationException,IllegalAccessException;创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException,SecurityException返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。parameterTypes 参数是 Class 对象的一个数组,这些 Class 对象按声明顺序标识构造方法的形参类型。
public class Demo3_Constructor {

	/**
	 * @throws Exception 
	 * 通过反射获取构造函数
	 */
	public static void main(String[] args) throws Exception {
		
		Class clazz = Class.forName("java.study.bean.Person");
		//通过无参构造创建对象
		Person p = (Person) clazz.newInstance();				

		//获取有参构造
		Constructor c = clazz.getConstructor(String.class,int.class);	
		//通过有参构造创建对象
		Person p = (Person) c.newInstance("张三",23);						

	}

}


public Field getField(String name) throws NoSuchFieldException,SecurityException;返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称。注意,此方法不反映数组类的 length 字段。
public void set(Object obj,Object value) throws IllegalArgumentException, IllegalAccessException将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
public void setAccessible(boolean flag)throws SecurityException将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
public class Demo4_Field {

	/**
	 * @throws Exception
	 * 通过反射获取成员变量
	 */
	public static void main(String[] args) throws Exception {
		Class clazz = Class.forName("java.study.bean.Person");
		//获取有参构造
		Constructor c = clazz.getConstructor(String.class,int.class);
		//通过有参构造创建对象	
		Person p = (Person) c.newInstance("张三",23);						
		
		//获取姓名字段
		//Field f = clazz.getField("name");								
		//修改姓名的值
		//f.set(p, "李四");	//由于name字段是私有的,所以会报错											
		//暴力反射获取字段
		Field f = clazz.getDeclaredField("name");
		//去除私有权限						
		f.setAccessible(true);												//修改姓名的值
		f.set(p, "李四");	
		
		System.out.println(p);
	}

}


public Method getMethod(String name,Class<?>... parameterTypes) throws NoSuchMethodException,SecurityException返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
public Object invoke(Object obj,Object... args)throws IllegalAccessException, IllegalArgumentException, InvocationTargetException;对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
public class Demo5_Method {

	/**
	 * @throws Exception 
	 * 通过反射获取方法
	 */
	public static void main(String[] args) throws Exception {
		Class clazz = Class.forName("java.study.bean.Person");
		//获取有参构造
		Constructor c = clazz.getConstructor(String.class,int.class);	
		//通过有参构造创建对象
		Person p = (Person) c.newInstance("张三",23);						
		
		//获取有参的setName方法		
		Method m2 = clazz.getMethod("setName", String.class);	
		//调用该方法		
		m2.invoke(p, "李四");
	}

}


猜你喜欢

转载自blog.csdn.net/Happy_cloudlife/article/details/78271458
今日推荐