Java反射

    1.   核心理解:
         允许在运行时通过Java Reflection APIS(即java.lang.Reflect.*;)来取得已知名字的class类的相关信息,动态地生成此类,并调用其方法或修改其生命围绕private的域的方法。

         通过类名动态生成类,并对该类的动态属性----方法,进行操作。

   2. 实例说明

package com.lxh.reflact;
public class A {
	@SuppressWarnings("unused")
	private String name = "ddd";
	protected int age;
	// 构造方法
	public A() {
	}
	public A(String name, int age) {
		this.name = name;
		this.age = age;
	}
	// 普通方法
	protected void showMess() {
		System.out.println("Hello World ...");
	}
	public void showMess2(String s) {
		System.out.println("Hello World2 ...\t" + s);
	}
	@SuppressWarnings("unused")
	private void showMess3() {
		System.out.println("Hello World3 ...");
	}
	@SuppressWarnings("unused")
	private void showMess4(String s) {
		System.out.println("Hello World4 ...\t" + s);
	}
}

package com.lxh.reflact;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 通过java反射实现对目标类的字段和属性进行操作
*/
public class ReflectTest {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) {

		try {
			Class<?> a = Class.forName("com.lxh.reflact.A");
			System.out.println(A.class.isInstance(a));
			System.out
					.println("$$$$$$$$$$$$$$$$$$$$$$$$反射获取所有方法$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
			Method met[] = a.getDeclaredMethods();
			// Method.setAccessible(met, true);// // 可以获取private,protected类型的方法
			for (Method m : met) {
				System.out.println(m);
			}
			System.out
					.println("$$$$$$$$$$$$$$$$$$$$$$$$反射获取构造方法$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
			Constructor cons[] = a.getConstructors();
			for (Constructor con : cons) {
				System.out.println(con);
			}
			System.out
					.println("$$$$$$$$$$$$$$$$$$$$$$$反射获取单个方法并执行$$$$$$$$$$$$$$$$$$$$$$$$$$$");
			Object obj2 = a.newInstance();
			Class arg[] = new Class[] { String.class };// 注意对有参函数调用的辅助参数
			Method m2 = a.getDeclaredMethod("showMess4", arg);
			System.out.println(m2);
			m2.setAccessible(true);
			m2.invoke(obj2, "lxh"); // 此时能调用private修饰的方法

			System.out
					.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$反射获取所有字段及值$$$$$$$$$$$$$$$$$$$$$$$");

			Field fds[] = a.getDeclaredFields();
			Field.setAccessible(fds, true);// 可以获取private,protected类型的字段
			for (Field f : fds) {
				System.out.println(f.getName() + "\t" + f.get(a.newInstance()));
			}
			System.out
					.println("======================获取单个字段并进行修改======================");
			Object obj = a.newInstance();
			Field f = a.getDeclaredField("name");
			f.setAccessible(true);// 可以操作private,protected类型的字段
			System.out.print("原 值:\t");
			System.out.println("name:\t" + f.get(obj));
			f.set(obj, "lxh4");
			System.out.print("更新后:\t");
			System.out.println("name:\t" + f.get(obj));

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
}

package com.lxh.reflact;
/**
* java反射机制实例的判断
*/
public class ReflectTest2 {
	public static void main(String[] args) {
	try {
		Class<?> a = Class.forName("com.lxh.reflact.A");
		Object obj = a.newInstance();
		System.out.println("============判断a是否为A类的一个实例===========");
		System.out.println(a+"\t"+a.isInstance(a)); // ---->false,原因同 A.class.isInstance(A.class)
		System.out.println(a.isInstance(obj));// true
		System.out.println(a.getClass().isInstance(a));// true
		System.out.println("============判断a.newInstance()是否为A类的一个实例:");
		System.out.println("a:"+a+"\tb:"+obj);
		System.out.println(a.isInstance(obj));// ---->true
		System.out.println(a.getClass().isInstance(obj));// false
		System.out.println("============判断a是否A类属于同一个类:");
		System.out.println(a.isAssignableFrom(obj.getClass()));// true
		System.out.println(a+",  "+a.getClass()+"\t\t"+a.isAssignableFrom(a.getClass()));// ---->false
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	} catch (InstantiationException e) {
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		e.printStackTrace();
	}
	}
}

package com.lxh.reflact;

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

import org.springframework.util.ReflectionUtils;
/**
 * 使用反射工具类操作目标类方法
 */
public class ReflectTest3 {
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
		Method m1 = ReflectionUtils.findMethod(A.class, "showMess");
		m1.setAccessible(true);
		m1.invoke(A.class.newInstance(), new Object[]{});
		Class arg[] = new Class[] { String.class };// 注意对有参函数调用的辅助参数
		Method m2 = ReflectionUtils.findMethod(A.class, "showMess4", arg);
		m2.setAccessible(true);
		System.out.println(m2);
		m2.invoke(A.class.newInstance(), new String("lxh"));
	}
}

   小结:
    1. Java反射机制的作用:
       <1> 在运行时判断任意一个对象所属的类;
       <2> 在运行时获取类的对象;
       <3> 在运行时获得类所具有的成员变量和方法等;
    2. java反射机制应用层次概括      

转载于:https://my.oschina.net/u/1989867/blog/528825

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值