1 package 反射; 2 3 public class Test反射 { 4 public static void main(String[] args) { 5 System.out.println(Runtime.getRuntime().getClass());//class java.lang.Runtime 6 Test反射 t=new Test反射(); 7 System.out.println(t.getClass());//class 反射.Test反射 8 } 9 }
1 package 反射; 2 3 public class Test反射 { 4 public static void main(String[] args) { 5 Test反射 t=new Test反射(); 6 //Class类是反射操作的源头,所有的反射都要从此类开始进行。 7 Class<?> cls=t.getClass();//第1种Class类实例化方法,用的很少 8 System.out.println(cls);//class 反射.Test反射 9 Class<?> cls2=Test反射.class;//第2种Class类实例化方法,用的多,使用领域:Hibernate、Mybatis、Spring 10 System.out.println(cls2);//class 反射.Test反射 11 Class<?> cls3=null; 12 try { 13 cls3=Class.forName("反射.Test反射");//第3种Class类实例化方法,用的多。此处要写全名,即加上包名,否则报错。 14 } catch (ClassNotFoundException e) { 15 e.printStackTrace(); 16 } 17 System.out.println(cls3);//class 反射.Test反射 18 } 19 }
1 package 反射; 2 class A{ 3 public A(){ 4 System.out.println("调用无参构造实例化对象。"); 5 } 6 @Override 7 public String toString() { 8 return "调用toString()方法。"; 9 } 10 } 11 public class Test反射 { 12 public static void main(String[] args) { 13 Class<?> cls=null; 14 try { 15 cls=Class.forName("反射.A"); 16 } catch (ClassNotFoundException e) { 17 e.printStackTrace(); 18 } 19 Object o=null; 20 try { 21 o=cls.newInstance(); 22 } catch (InstantiationException e) { 23 e.printStackTrace(); 24 } catch (IllegalAccessException e) { 25 e.printStackTrace(); 26 } 27 System.out.println(o); 28 /** 29 * 运行结果: 30 * 调用无参构造实例化对象。 31 * 调用toString()方法。 32 */ 33 } 34 }
1 package 反射; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.InvocationTargetException; 5 6 class A{ 7 private String name; 8 private int age; 9 public A(String name,int age){ 10 System.out.println("调用有参构造实例化对象。"); 11 this.name=name; 12 this.age=age; 13 } 14 @Override 15 public String toString() { 16 return "调用toString()方法:name="+name+",age="+age; 17 } 18 } 19 public class Test反射 { 20 public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { 21 Class<?> cls=null; 22 try { 23 cls=Class.forName("反射.A"); 24 } catch (ClassNotFoundException e) { 25 e.printStackTrace(); 26 } 27 Object o=null; 28 try { 29 Constructor<?> con=cls.getConstructor(String.class,int.class); 30 o=con.newInstance("张三",18);//从此处可以看出以后定义类的构造方法时最好保留一个无参构造。 31 } catch (InstantiationException e) { 32 e.printStackTrace(); 33 } catch (IllegalAccessException e) { 34 e.printStackTrace(); 35 } 36 System.out.println(o); 37 /** 38 * 运行结果: 39 * 调用有参构造实例化对象。 40 * 调用toString()方法:name=张三,age=18 41 */ 42 } 43 }
1 package 反射; 2 3 import java.lang.reflect.InvocationTargetException; 4 import java.lang.reflect.Method; 5 6 class Person{ 7 private String name; 8 public void setName(String name) { 9 this.name = name; 10 } 11 public String getName() { 12 return name; 13 } 14 } 15 public class Test反射 { 16 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { 17 Class<?> cls=Class.forName("反射.Person"); 18 Object obj=cls.newInstance(); 19 Method methodSetName=cls.getMethod("setName", String.class); 20 Method methodGetName=cls.getMethod("getName"); 21 methodSetName.invoke(obj, "张三"); 22 System.out.println(methodGetName.invoke(obj));//张三 23 } 24 }
1 package 反射; 2 3 import java.lang.reflect.Field; 4 5 class Person{ 6 @SuppressWarnings("unused") 7 private String name; 8 } 9 public class Test反射 { 10 public static void main(String[] args) throws Exception { 11 Class<?> cls=Class.forName("反射.Person"); 12 Object obj=cls.newInstance(); 13 Field fieldName=cls.getDeclaredField("name"); 14 fieldName.setAccessible(true);//私有属性的存取不建议用引方式,最好还是用setter和getter方法 15 fieldName.set(obj, "张三"); 16 System.out.println(fieldName.get(obj));//张三 17 } 18 }