java Reflection反射

import java.lang.reflect.*;
public class Reflection {

	public static void main(String[] args) {
		
		ReflectPerson p = new ReflectPerson("chenzq", 20);
		Class<? extends ReflectPerson> c1 = p.getClass();
		System.out.println(c1);

		Class<String> c2 = String.class;
		System.out.println(c2);
		
		Class<?> c3 = null;
        try {
            c3 = Class.forName("com.jaeson.javastudy.ReflectPerson");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(c3);
		
        //Class类的有参构造对象
        Class<?> c4 = null;
        ReflectPerson person = null;
        try {
        	c4 = Class.forName("com.jaeson.javastudy.ReflectPerson");
        	Constructor<?> con = c4.getConstructor(new Class[]{String.class, int.class});
        	person = (ReflectPerson) con.newInstance("jaesonchen", 30);
        	System.out.println(person);
            
        	System.out.println(c4.getClassLoader()); 
       		System.out.println(c4.getInterfaces()); 
        	System.out.println(c4.getConstructors()); 
        	
        	Method[] m = c4.getDeclaredMethods();
        	for (int i = 0; i < m.length; i++) {
        		System.out.println(m[i]);
        	}
        	
        	Field f = c4.getDeclaredField("name");
        	//name是私有属性,所以要设置安全检查为true
        	f.setAccessible(true);
        	System.out.println("name:" + (String) f.get(person));
        	
        	f.set(person, "chenzq");
        	System.out.println(person);
        	
        	Method m2 = c4.getMethod("show", String.class);
        	m2.invoke(person, "hello world");
        	
        } catch (IllegalArgumentException e) { 
        	e.printStackTrace();
        } catch (InvocationTargetException e) { 
        	e.printStackTrace();
        } catch (NoSuchFieldException e) {
        	e.printStackTrace();
        } catch (NoSuchMethodException e) {
        	e.printStackTrace();
        } catch (ClassNotFoundException e) {
        	e.printStackTrace();
        } catch (InstantiationException e) {
        	e.printStackTrace();
        } catch (IllegalAccessException e) {
        	e.printStackTrace();
        } 
         
	}

}

class ReflectPerson {
	private String name;
	private int age;
	public ReflectPerson(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public void show(String str) {
		System.out.println(str);
	}
	public String toString() {
		return "name:" + this.name + ",age:" + this.age;
	}
	
}

  * java1.5中一个变化是类 java.lang.Class是泛型化的。
     现在,Class有一个类型参数T, 它代表Class对象代表的类型。

     比如说,String.class类型代表 Class<String>。

   * 由于Class类没有构造方法,所以实例化Class类的方式有点特殊:
     (1) 对象.getClass()
     (2) 类.Class
     (3) Class.forName("全限定类名") 会抛出ClassNotFoundException异常
     (4) classloader.loadClass(name)

   * Class.newInstance(),Class对象包含的内容就是反射好的那个类,用来创建一个Class类对象的新实例。
     Class的 newInstance() 方法现在返回一个T, 你可以在使用反射创建对象时得到更精确的类型。
     抛出InstantiationException和IllegalAccessException

输出为:

class com.jaeson.javastudy.ReflectPerson
class java.lang.String
class com.jaeson.javastudy.ReflectPerson
name:jaesonchen,age:30
sun.misc.Launcher$AppClassLoader@6d4b473
[Ljava.lang.Class;@5dcba031
[Ljava.lang.reflect.Constructor;@63822112
public java.lang.String com.jaeson.javastudy.ReflectPerson.toString()
public void com.jaeson.javastudy.ReflectPerson.show(java.lang.String)
name:jaesonchen
name:chenzq,age:30
hello world

猜你喜欢

转载自jaesonchen.iteye.com/blog/2286607
今日推荐