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