您的位置:首页 > 编程语言 > Java开发

JAVA反射的基本使用

2016-08-31 15:27 316 查看
下面直接通过列子的方法给出使用方法:

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 Employee
System.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 b
System.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 setId
for(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");
//因为是静态的所以传入的是class
ArrayList<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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 反射