反射
POJO(User)
public class User {
private String name;
private String age;
private String height;
private String id;
private String address;
public User(){
super();
}
public User(String name,int age,int height,String id,String address){
this.name=name;
this.age=Integer.toString(age)+"岁";
this.height=Integer.toString(height)+"kg";
this.id=id;
this.address=address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
System.out.println("xmwokdwioedj");
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", height=" + height
+ ", id=" + id + ", address=" + address + "]";
}
private void eat(String name){
this.name=name;
System.out.println(name+"在吃萝卜");
}
private void run(){
System.out.println("user会跑 不是loser");
}
}
方法 | 详情 |
---|---|
Class.forName(“包名 . 类名”) | 获取“类对象” |
类名 . class | 获取“类对象” |
导管 | 获取“类对象” |
getFields() | (私有,继承&公有] 变量 |
getDeclaredFields() | [私有&公有,继承) 变量 |
getConstructors(int.class, String.class……) | 获得public构造方法 |
getDeclaredConstructors(int.class, String.class……) | 获得private构造方法 |
getMethods() | (私有,继承&公有] 方法 |
getDeclaredMethods() | [私有&公有,继承) 方法 |
反射有参构造方法(创造一个有参的对象):
Class<?> clazz= User.class; //获取有参构造方法时一定要传上这个有参构造的所有参数类型
Constructor<?> con= clazz.getConstructor(String.class,int.class,int.class,String.class,String.class);
//获取User类的一个有5个参数的构造方法
Object obj= con.newInstance("饭先生",20,63,"001","南昌");
反射类的新建实例并设置有参构造的参数值
System.out.println(obj);
执行结果:
反射设置一个对象的单个属性:
Class<?> clazz=User.class;
User user=new User();
Field field= clazz.getDeclaredField("name");//获取这个对象name的属性
field.setAccessible(true);//设置这个name属性为可见性
field.set(user, "小强");//设置user的name属性值为小强
System.out.println(user.getName());//通过user类内部的getName()方法获取设置的name值
执行结果:
反射获取一个类的方法 getDeclaredMethod [私有,继承)
Class<?> clazz= User.class;//获取User这个类对象
Method eat=clazz.getDeclaredMethod("eat",String.class);//获取User中有参方法eat(String name) 获取有参方法时要写返回的参数类型
eat.setAccessible(true);//私有属性获取时要开启可见权限
eat.invoke(new User(), "我小凡");//反射取出eat方法并设置eat参数的值
Method run=clazz.getDeclaredMethod("run");//获取User中无参方法run() 获取无参方法时不用考虑
run.setAccessible(true);//私有属性获取时要开启可见权限
run.invoke(new User());//反射取出run方法
执行结果:
获取到一个类里所有的构造方法、方法、属性
Class<?> clazz=User.class;
int modifiers = clazz.getModifiers();//获取user类的public or private
String mo = Modifier.toString(modifiers);
System.out.println(mo+" "+clazz.getSimpleName());//User.class.getSimpleName()是获取User类的类名
Constructor<?>[] cond = clazz.getDeclaredConstructors();
for(int i=0;i<cond.length;i++){
Class<?>[] parameterTypes = cond[i].getParameterTypes();
System.out.print(Modifier.toString(cond[i].getModifiers())+" "+clazz.getSimpleName()+"(");
for(int j=0;j<parameterTypes.length;j++){
System.out.print(parameterTypes[j].getSimpleName()+" args"+j+",");
}
System.out.println("){}");
}
Method[] dm = clazz.getDeclaredMethods();
System.out.print("方法:");
for(int i=0;i<dm.length;i++){
dm[i].setAccessible(true);
System.out.print((i+1)+"."+dm[i].getName()+"方法 ");
}
System.out.println();
Field[] df = clazz.getDeclaredFields();
System.out.print("属性:");
for(int i=0;i<df.length;i++){
df[i].setAccessible(true);
System.out.print((i+1)+"."+df[i].getType().getSimpleName()+" "+df[i].getName()+" ");
}
整形List集合添加String类型的元素
泛型在运行期会被擦掉 ,即可通过反射来添加其他类型的元素
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
// list.add("小范"); 通过反射在类型为Integer的list添加一个string类型的元素
Class<? extends List> clazz = list.getClass();
Method method = clazz.getMethod("add", Object.class);//反射获取list的add方法 add是有参方法,万物皆对象,直接填Object的类型
method.invoke(list, "小范");//这样就添加了
System.out.println(list); //泛型只在编译期起作用