Java反射
1 package com.reflex; 2 3 import java.lang.reflect.Constructor; 4 5 import java.lang.reflect.Field; 6 7 import java.lang.reflect.InvocationTargetException; 8 9 import java.lang.reflect.Method; 10 11 import java.util.ArrayList; import java.util.List; 12 13 import org.junit.Test; 14 15 //反射定义:反射就是加载类,并解刨类的各个组成部分 public class Demo1 { 16 17 public static void main(String[] args) throws ClassNotFoundException { 18 // TODO Auto-generated method stub 19 //使用反射,首先要知道有一个Class类代表某一类的字节码 20 //获取某一类字节码的三种办法 21 //1 22 Class clazz = Class.forName("/Test/src/daythree/reflex/Person.java"); 23 //2 24 Class clazz1 = new Person().getClass(); 25 //3 26 Class clazz2 = Person.class; 27 } 28 @Test //非私有构造函数 29 public void reFlex() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ 30 Class clazz = Class.forName("daythree.reflex.Person"); 31 Constructor cs = clazz.getConstructor(String.class); //没有参数填写null 32 Person person = (Person) cs.newInstance("12233"); // 实例化 33 } 34 35 @Test 36 public void reFlexS() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ 37 Class clazz = Class.forName("daythree.reflex.Person"); 38 Constructor cs = clazz.getDeclaredConstructor(List.class); 39 cs.setAccessible(true);//暴力反射 40 Person person = (Person) cs.newInstance(new ArrayList<>());======== 41 42 } 43 @Test //方法反射 getMethod 第一个参数方法名 第二个参数方法参数 invoke第一个是方法所在类第二个参数 44 public void FangfaFlex() throws Exception{ 45 Person person = new Person(); 46 Class clazz = Class.forName("daythree.reflex.Person"); 47 Method method = clazz.getMethod("Demo2",null); 48 method.invoke(person, null); 49 } 50 51 @Test //字段发射 从类中赋值 或者取值 52 public void ZiduanFlex() throws Exception{ 53 Person person = new Person(); 54 Class clazz = Class.forName("daythree.reflex.Person"); 55 Field field = clazz.getField("name"); 56 //String name = (String)field.get(person); 取值 57 field.set(person, "dashage"); //赋值 58 System.out.println(field.getType()); //取类别 59 System.out.println(person.name); 60 } 61 } 62 63 class Person { 64 65 public String name = "shadage"; 66 67 public Person() { 68 69 } 70 71 public Person(String a) { 72 System.out.println(a); 73 } 74 75 private Person(List ls) { 76 System.out.println("true"); 77 } 78 79 public int[] Demo1(int[] a){ 80 int b[] = new int[]{1,2,3}; 81 return b; 82 } 83 public Class[] Demo1(int a){ 84 Class b[] = new Class[]{String.class,int.class}; 85 return b; 86 } 87 public void Demo2(){ 88 System.out.println("方法输出"); 89 } 90 }