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");
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反射的基本使用
- java反射的基本使用
- java反射基本使用操作
- java中反射的基本使用方法
- java反射-java Class基本使用
- 加强eclipse的使用技巧。可变参数。基本数据类型自动装箱和拆箱。枚举。反射。数组反射的应用。ArrayList和HashSet。JavaBean
- java反射基本使用(得到类中属性、方法、构造方法)
- Java反射基本概述及使用方法
- java 反射基本使用
- java 反射的基本使用
- Java反射基本使用方法 示例
- java反射的基本使用
- java中反射基本的方法以及使用
- Java数组特点及基本使用技巧
- JAVA反射使用手记
- 通过反射动态使用Java类(转)
- 使用Java 5特性来简化反射编程
- JAVA反射使用手记
- 使用Java5特性来简化反射编程
- Lucene的一些基本使用方法和概念 (JAVA)