码迷,mamicode.com
首页 > 编程语言 > 详细

Java反射

时间:2015-11-11 13:31:02      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:

    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"));
	}
}
技术分享

Java反射

标签:

原文地址:http://my.oschina.net/u/1989867/blog/528825

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!