`
yuxiangtong
  • 浏览: 6484 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Java反射机制

阅读更多
-------------------------TestReflection01.java-------------------------
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

@SuppressWarnings("unchecked")
public class TestReflection01 {
	public static void main(String[] args) {
		System.out.println("请输入类型名称:");
		Scanner scan = new Scanner(System.in);
		String className = scan.next();		
		System.out.println("当前类型:" + className);			

		try {
			//获取Class对象
			Class c = Class.forName(className);			
			
			//解析属性信息
			Field[] fs = c.getDeclaredFields();
			for (Field f : fs) {
				System.out.println("----------------------------------------------");
				System.out.println("属性:" + f.toString());
				System.out.println("\t数据类型:" + f.getType());
				System.out.println("\t属性名:" + f.getName());
				int mod = f.getModifiers();				
				System.out.println("\t属性修饰符:" + Modifier.toString(mod));
			}
			
			//解析方法信息
			Method[] ms = c.getDeclaredMethods();
			for(Method m : ms){
				System.out.println("----------------------------------------------");
				System.out.println("方法:" + m.toString());				
				System.out.println("\t方法名:" + m.getName());
				int mod = m.getModifiers();				
				System.out.println("\t方法修饰符:" + Modifier.toString(mod));
				System.out.print("\t方法参数列表:");
				Class pts[] = m.getParameterTypes();
				for (int i = 0; i < pts.length; i++) {
					Class class1 = pts[i];
					if(i != 0 )
						System.out.print(", ");
					System.out.print(class1);
				}	
				System.out.println();
				System.out.println("\t返回值类型:" + m.getReturnType());
			}
			
			//解析构造方法信息
			Constructor[] cs = c.getDeclaredConstructors();
			for (Constructor con : cs) {
				System.out.println("----------------------------------------------");
				System.out.println("构造方法:" + con.toString());				
				System.out.println("\t方法名:" + con.getName());
				int mod = con.getModifiers();				
				System.out.println("\t方法修饰符:" + Modifier.toString(mod));
				System.out.print("\t方法参数列表:");
				Class pts[] = con.getParameterTypes();
				for (int i = 0; i < pts.length; i++) {
					Class class1 = pts[i];
					if(i != 0 )
						System.out.print(", ");
					System.out.print(class1);
				}	
				System.out.println();
			}			
			System.out.println("----------------------------------------------");
			
			//解析当前类类型的父类
			Class superClass = c.getSuperclass();
			System.out.println("当前类的父类:" + superClass.toString());			
			System.out.println("----------------------------------------------");
			
			//解析当前类实现的接口
			Class[] interfaces = c.getInterfaces();
			System.out.print("当前类所实现接口:");
			for (Class class1 : interfaces) {
				System.out.print(class1.toString() + "\t");
			}			
			System.out.println("\n----------------------------------------------");
			
			//解析当前类型所在包信息
			Package p = c.getPackage();
			System.out.println("当前类所在包" + p.toString());
		} catch (ClassNotFoundException e) {			
			e.printStackTrace();
		}
	}
}


-------------------------TestReflection02.java-------------------------
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import p2.User;

@SuppressWarnings("unchecked")
public class TestReflection02 {
	public static void main(String[] a) throws Exception{
		User p1 = new User("张三",18);		
		TestReflection02 t = new TestReflection02();

		System.out.println("----------------------------------------");
		t.mf1(p1,"name","李四");
		t.mf1(p1,"age",30);
		System.out.println(p1);
		
		System.out.println("----------------------------------------");
		t.mf2("p2.User", "total",88);
		
		System.out.println("----------------------------------------");
		Class[] argTypes = {String.class,int.class};
		Object[] args = new Object[]{"王五",99};
		t.mf3(p1, "setAll",argTypes,args);
		System.out.println(p1);
		
		System.out.println("----------------------------------------");
		t.mf4("p2.User", "showTotal",null,null);		
	}
	
	//直接操作对象属性
	public void mf1(Object o,String fieldName,Object newValue) throws  NoSuchFieldException, IllegalAccessException {
		Class c = o.getClass();  
		Field f = c.getField(fieldName);
		Object fv = f.get(o);
		System.out.print("修改前:" + fieldName + "=" + fv);
		f.set(o,newValue);
		System.out.println("\t修改后:" + fieldName + "=" + f.get(o));		
	}
	
	//直接操作类属性
	public void mf2(String className,String fieldName,Object newValue) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
		Class c = Class.forName(className);
		Field f = c.getField(fieldName);
		Object fv = f.get(c);
		System.out.print("修改前:" + fieldName + "=" + fv);
		f.set(c,newValue);
		System.out.println("\t修改后:" + fieldName + "=" + f.get(c));
	}	

	//调用对象成员方法
	public void mf3(Object o,String methodName,Class[]argTypes,Object[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
		Class c = o.getClass();
		Method m = c.getMethod(methodName, argTypes);
		Object result = m.invoke(o, args);
		System.out.println(result);
	}	
	
	//调用类成员方法
	public void mf4(String className,String methodName,Class[]argTypes,Object[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
		Class c = Class.forName(className);
		Method m = c.getMethod(methodName, argTypes);
		Object result = m.invoke(null, args);
		System.out.println("result:" + result);
	}		
}

-------------------------TestReflection03.java-------------------------
/**
 * 
 */
import java.lang.reflect.*;

@SuppressWarnings("unchecked")
public class TestReflection03 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Class c;
		try {
			c = Class.forName("p1.Person");
			
			//调用有参数的构造方法
	        Class[] argTypes = {String.class,int.class};
	        Constructor constructor = c.getConstructor(argTypes);
	        Object obj = constructor.newInstance("中国",5000);
	        System.out.println(obj);
	        
	        //调用无参构造方法1
	        constructor = c.getConstructor();	        
	        //constructor = c.getConstructor(new Class[0]);
	        //constructor = c.getConstructor(null);
	        obj = constructor.newInstance();
	        System.out.println(obj);
	        
	        //调用无参构造方法2
	        obj = c.newInstance();
	        System.out.println(obj);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

1
0
分享到:
评论

相关推荐

    java反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者能够在运行时动态地获取类的信息(如类名、方法名、参数类型)并调用方法,创建对象,甚至...

    JAVA反射机制应用

    JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    一个例子让你了解Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...

Global site tag (gtag.js) - Google Analytics