1.获取类对象 Class class = Class.forName("pojo.Hero");
2.获取构造器对象 Constructor con = clazz.getConstructor(形参.class);
3 获取(实例化)对象 Hero hero =con.newInstance(实参);
通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
1.获取构造方法:
1).批量的方法:
public Constructor[] getConstructors():所有"公有的"构造方法
public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
2).获取单个的方法,并调用:
public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
2、获取对象属性
Field[] allFields = class1.getDeclaredFields();//获取class对象的所有属性
Field[] publicFields = class1.getFields();//获取class对象的public属性
Field ageField = class1.getDeclaredField("age");//获取class指定属性
Field desField = class1.getField("des");//获取class指定的public属性
3、获取对象方法
Method[] methods = class1.getDeclaredMethods();//获取class对象的所有声明方法
Method[] allMethods = class1.getMethods();//获取class对象的所有方法 包括父类的方法
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。
例:
public static void main(String[] args) {
try {
/**
* class.newInstance() 调用默认的、公有的、无参构造函数
*/
Class dataClass = Class.forName("com.sys.server.model.common.DataVo");
DataVo dataVo = (DataVo) dataClass.newInstance();
System.out.println(dataVo);
/**
*
* Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
* Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。
*
*
* dataClass.getConstructor() 调用默认的或公有的无参构造函数
* dataClass.getConstructor(String.class...) 获取公有的有参构造函数
*
* dataClass.getDeclaredConstructor() 可调用默认的、公有的、私有的无参构造函数
* dataClass.getDeclaredConstructor(String.class...) 调用默认的、公有的、私有的有参构造函数
*
*/
Constructor constructor = dataClass.getConstructor();
Object dataVo1 = constructor.newInstance();
System.out.println(dataVo1);
constructor = dataClass.getConstructor(String.class);
Object dataVo2 = constructor.newInstance("999");
System.out.println(dataVo2);
constructor = dataClass.getDeclaredConstructor();
constructor.setAccessible(true);
Object dataVo3 = constructor.newInstance();
System.out.println(dataVo3);
constructor = dataClass.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object dataVo4 = constructor.newInstance("888");
System.out.println(dataVo4);
/**
* getField(String fieldName),获取某个"公有的"字段
* getDeclaredField(String fieldName),获取某个字段(可以是私有的)
*/
Field field = dataClass.getDeclaredField("pileId");
// 暴力反射,不设置为true,私有属性设置值会抛异常
field.setAccessible(true);
field.set(dataVo4, "111");
System.out.println(dataVo4);
/**
* getMethod(String name,Class<?>... parameterTypes) 获取公有的setPileNo()方法
* getDeclaredMethod(String name,Class<?>... parameterTypes) setStationId()方法
*/
Method method = dataClass.getMethod("setPileNo", String.class);
method.invoke(dataVo4, "2222");
System.out.println(dataVo4);
method = dataClass.getDeclaredMethod("setStationId", String.class);
method.setAccessible(true);
method.invoke(dataVo4, "3333");
System.out.println(dataVo4);
} catch (Exception e) {
e.printStackTrace();
}
}
DataVo
package com.sys.server.model.common;
import lombok.Data;
/**
* DataVo
*
* @author admin
* @date 2021-10-28 14:17
*/
@Data
public class DataVo {
private String pileId;
private String orgCode;
private String stationId;
private String pileNo;
private String pileName;
public DataVo(){
}
public DataVo(String name){
this.pileName = name;
}
public String getPileId() {
return pileId;
}
public void setPileId(String pileId) {
this.pileId = pileId;
}
public String getOrgCode() {
return orgCode;
}
public void setOrgCode(String orgCode) {
this.orgCode = orgCode;
}
public String getStationId() {
return stationId;
}
private void setStationId(String stationId) {
this.stationId = stationId;
}
public String getPileNo() {
return pileNo;
}
public void setPileNo(String pileNo) {
this.pileNo = pileNo;
}
public String getPileName() {
return pileName;
}
public void setPileName(String pileName) {
this.pileName = pileName;
}
}