⑤. 反射获取成员变量并使用
5>.
反射获取成员变量并使用
①. Field[ ] getFields():返回所有公共成员变量对象的数组
②. Field[ ]getDeclaredFields():`返回所有成员变量对象的数组
③. Field[ ] getField(String name):返回单个公共成员变量对象
④. Field getDeclaredFiled(String name):返回单个成员变量对象
Field 类中用于给成员变量赋值的方法
⑤. void set(Object obj,Object value):
给obj对象的成员变量赋值为value
@Test public void fun6()throws Exception{ Class clazz=Class.forName("itheima.com.Person"); //Person p = (Person) clazz.newInstance(); //公共的成员变量 Field[] fields = clazz.getFields(); for(Field field:fields){ System.out.println(field); //public int itheima.com.Person.age } //所有的成员变量 Field[] declaredFields = clazz.getDeclaredFields(); for(Field field2:declaredFields){ System.out.println(field2); //private java.lang.String itheima.com.Person.name //public int itheima.com.Person.age } System.out.println("-------"); //获取一个成员变量 Field ageField = clazz.getField("age"); System.out.println(ageField);//public int itheima.com.Person.age //创建对象 Constructor con = clazz.getConstructor(); Object p = con.newInstance(); //void set(Object obj,Object value):将指定对象参数中由此Field对象表示的字段设置为指定的新值 ageField.set(p,11); System.out.println(p);//Person{name='null', age=11} }
⑥. 反射获取成员方法并使用
6>.
反射获取成员方法并使用
Class类中用于获取成员方法的方法
①. Method [ ] getMethods():返回所有公共成员方法对象的数组,包括继承的
②. Method[ ] getDeclaredMethods():返回所有成员变量对象的数组,不包括继承的
③. Method getMethod(String name,Class<?> .....parameterTypes):返回单个公共成员方法对象
④. Method getDeclaredMethod(String name,Class<?> .....parameterTypes):返回单个成员方法对象
Method类中用于调用成员方法的方法
Object invoke(Object obj,Object....args):
调用obj对象的成员方法,参数是args,返回值是Object类型
public class Student { //成员变量:一个私有,一个默认,一个公共 private String name; int age; public String address; //构造方法:一个私有,一个默认,两个公共 public Student() { } private Student(String name) { this.name = name; } Student(String name, int age) { this.name = name; this.age = age; } public Student(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } //成员方法:一个私有,四个公共 private void function() { System.out.println("function"); } public void method1() { System.out.println("method"); } public void method2(String s) { System.out.println("method:" + s); } public String method3(String s, int i) { return s + "," + i; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", address='" + address + '\'' + '}'; } }
/* 练习:通过反射实现如下操作 Student s = new Student(); s.method1(); s.method2("林青霞"); String ss = s.method3("林青霞",30); System.out.println(ss); s.function(); */ public class ReflectDemo02 { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //获取Class对象 Class<?> c = Class.forName("com.itheima_02.Student"); //Student s = new Student(); Constructor<?> con = c.getConstructor(); Object obj = con.newInstance(); //s.method1(); Method m1 = c.getMethod("method1"); m1.invoke(obj); //s.method2("林青霞"); Method m2 = c.getMethod("method2", String.class); m2.invoke(obj,"林青霞"); // String ss = s.method3("林青霞",30); // System.out.println(ss); Method m3 = c.getMethod("method3", String.class, int.class); Object o = m3.invoke(obj, "林青霞", 30); System.out.println(o); //s.function(); // Method m4 = c.getMethod("function"); //NoSuchMethodException: com.itheima_02.Student.function() Method m4 = c.getDeclaredMethod("function"); m4.setAccessible(true); m4.invoke(obj); } }
⑦. 关于反射的练习
7>.
关于反射的练习
- ①. 有一个ArrayList
<Integer>
集合,现在我想在这个集合中添加一个字符串数据,如何实现?
public class ReflectTest01 { public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { //创建集合 ArrayList<Integer> array = new ArrayList<Integer>(); // array.add(10); // array.add(20); // array.add("hello"); Class<? extends ArrayList> aClass = array.getClass(); Method m1=aClass.getMethod("add",Object.class); m1.invoke(array,"hello"); m1.invoke(array,"world"); System.out.println(array); } }
②. 通过配置文件运行类中的方法
public class ReflectTest02 { public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //把文件中的数据通过Io流读取,读取后放入集合中 Properties prop = new Properties(); //FileReader fr = new FileReader("myReflect\\class.txt"); FileReader fr = new FileReader("myReflect\\class.properties"); prop.load(fr); fr.close(); //获取到类名和方法名 String className = prop.getProperty("className"); String methodName = prop.getProperty("methodName"); //通过反射来使用 Class<?> c = Class.forName(className);//com.itheima_06.Student Constructor<?> con = c.getConstructor(); Object obj = con.newInstance(); Method m = c.getMethod(methodName);//study m.invoke(obj); } }