package wang.study.reflect;
import lombok.Data;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@Data
public class User {
private String name;
private String passwd;
private Integer age;
@Data
class Book{
private String bookName;
private Integer pages;
private String read(){
System.out.println("read book ing...");
return "hong lou meng";
}
public Book(String bookName, Integer pages) {
this.bookName = bookName;
this.pages = pages;
}
}
public User() {
}
public User(String name) {
this.name = name;
}
public User(String name, String passwd) {
this.name = name;
this.passwd = passwd;
}
public User(String name, String passwd, Integer age) {
this.name = name;
this.passwd = passwd;
this.age = age;
}
private void greet(){
System.out.println("greet");
}
private void greet(String msg){
System.out.println("greet"+msg);
}
private String greet(String msg,String name){
String str = "name is:"+name+"greet"+msg;
return str;
}
public static void main(String[] args) throws Exception{
Class<?> clzz = Class.forName("wang.study.reflect.User");
// User o = (User)clzz.newInstance();
// o.setName("ctl");
// System.out.println(o.getName());
// Constructor<?> constructor = clzz.getConstructor(String.class);
// User o = (User)constructor.newInstance("css");
// System.out.println(o.getName());
// Constructor<?> constructor = clzz.getConstructor(String.class, String.class);
// User o = (User)constructor.newInstance("css","123456");
// System.out.println(o.getName()+o.getPasswd());
// Method greet = clzz.getDeclaredMethod("greet");
// greet.invoke(clzz.newInstance());
// Method greet = clzz.getDeclaredMethod("greet",String.class);
// greet.invoke(clzz.newInstance(),"哈哈哈哈哈");
// Method greet = clzz.getDeclaredMethod("greet",String.class,String.class);
// String invoke = (String)greet.invoke(clzz.newInstance(), "哈哈哈哈哈", "ctl");
// System.out.println(invoke);
// Field name = clzz.getDeclaredField("name");
// Object o = clzz.newInstance();
// name.set(o,"wang da chui");
// System.out.println(name.get(o));
User o = (User)clzz.newInstance();
Class<?> clzz2 = Class.forName("wang.study.reflect.User$Book");
Method read = clzz2.getDeclaredMethod("read");
//可见性
read.setAccessible(true);
Object honglou = read.invoke(clzz2.getDeclaredConstructor(User.class, String.class, Integer.class).newInstance(o, "honglou", 10));
System.out.println(honglou);
Constructor<?> declaredConstructor = clzz2.getDeclaredConstructor(User.class);
Object o1 = declaredConstructor.newInstance(o);
System.out.println(o1);
}
}
反射先获取到class对象
然后获取 constructor、field、method的对象
如果需要实例化,可以调用constructor的方法
如果需要调用method,注意传实例化对象和参数
如果需要设置field,注意传实例化对象和值
如果 需要获取值,注意传实例化对象
对于内部类,需要同时获取外部和内部类的class对象,内部类是$xx添加
当调用内部类方法,注意传外部类对象类型。
可以参考参考
内部类创建注意点
内部类的构造方法,即使是无参构造,参数其实也是传递了外部类的类型的,在实例化的时候,要传递外部类实例化的对象,否则创建会失败。
Constructor<?> declaredConstructor = clzz2.getDeclaredConstructor(User.class);
Object o1 = declaredConstructor.newInstance(o);