JAVA反射的基本使用

来源:互联网 发布:蓝胖升级数据 编辑:程序博客网 时间:2024/05/22 12:56

下面直接通过列子的方法给出使用方法:

Employee:

package com.xiaoqi.reflect;public class Employee {private String name;private int id;private boolean b;public Employee(String name, int id, boolean b) {super();this.name = name;this.id = id;this.b = b;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public boolean isB() {return b;}public void setB(boolean b) {this.b = b;}}

EmployeeManager:

package com.xiaoqi.test;import java.util.ArrayList;public class EmployeeManager {private Employee employee;public ArrayList<Employee> employeeList;public void setParams(Employee employee,ArrayList<Employee> employeeList){this.employee = employee;this.employeeList = employeeList;}public static void setEmployee(){System.out.println("hahaha");}public EmployeeManager(){}}

使用方式:

1、获取class的方式

Class<?> class1 = Class.forName("com.xiaoqi.reflect.Employee");Class<?> class2 = Employee.class;Employee employee = new Employee("张三",1,false);Class<?> class3 = employee.getClass();

2、获取类的名称:

//result:  public class EmployeeSystem.out.println(Modifier.toString(class3.getModifiers())+" class "+class3.getSimpleName());

3、获取字段名称类型 和 方法名称:

Field[] fields = class3.getDeclaredFields();for(Field field:fields){//result: private String name//      private int id//      private boolean bSystem.out.println(Modifier.toString(field.getModifiers())+" "+field.getType().getSimpleName()+" "+field.getName());//获得具体的名称 如:java.lang.String System.out.println(field.getType().getCanonicalName());}Method[] methods = class3.getDeclaredMethods();//result :  public getName//public getId//public setName//public setB//public isB//public setIdfor(Method m:methods){System.out.println(Modifier.toString(m.getModifiers())+" "+m.getName());}

4、通过反射创建对象:

Class<?> class1 = Class.forName("com.xiaoqi.reflect.Employee");Employee emp = (Employee) class1.newInstance();Constructor<Employee> con = (Constructor<Employee>) class3.getConstructor(String.class,                  int.class,boolean.class);  Employee obj = (Employee)con.newInstance("lxf", 23,true);  

5、创建对象并赋值:

    //获取id属性      Field idF = class1.getDeclaredField("id");      //实例化这个类赋给o      Object o = class1.newInstance();      //打破封装      idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。      //给o对象的id属性赋值"110"      idF.set(o, "110"); //set  

6、获取类的属性

                EmployeeManager manage = new EmployeeManager();Class employeeManager = manage.getClass();Field field = employeeManager.getDeclaredField("employee");field.setAccessible(true); //如果该字段是private,需要加上该方法Employee emp = (Employee) field.get(manage);Field field2 = employeeManager.getField("employeeList");//因为是静态的所以传入的是classArrayList<Employee> list = (ArrayList<Employee>) field2.get(employeeManager);


7、通过method.invoke调用类方法

Employee employee = new Employee("张三",1,false);Method method = employee.getClass().getMethod("setName", String.class);  method.invoke(employee, "ckl");  


0 0