被反射的类
package com.qtu;
public class People {
private int id ;
private String name;
private String sex;
public People() {
}
@Override
public String toString() {
return "People{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public People(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public void shuw(){
System.out.println("shuw");
}
}
反射的各类方法使用自我笔记展示
package com.qtu;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test01 {
Class c = null;
@Test
public void a() {
c = People.class;
try {
//获取接口 构造器 父类 创建对象*******************************************************************
//获得所有的接口
Class<?>[] interfaces = c.getInterfaces();
//获得父类
Class<? super People> superclass = c.getSuperclass();
//获得全部的构造器;
Constructor constructor = c.getConstructor();
//取得指定参数的构造器
Constructor dec = c.getDeclaredConstructor(int.class, String.class, String.class);
//通过上面创建的构造器创建了一个对象,并赋值
People people = dec.newInstance(3, “小花”, “男”);
//不通过对象来使用属性和方法****************************************************************************
//获得属性 通过属性的变量名来获取
// c.getField(“name”);//只能调用公开的属性
//调出全部的属性
Field[] declaredFields = c.getDeclaredFields();
for (Field declaredField : declaredFields) {
///如果属性是不可见的 需要改变可见性
declaredField.setAccessible(true);
//判断属性的 数据类型 并进行赋值改变 将 id 由 3 改为 2
if (declaredField.getType()== int.class) declaredField.set(people,2);
}
//公开的全部属性
Field[] fields = c.getFields();
//调用特定的属性 可以调用私有的属性
Field name = c.getDeclaredField("name");
//通过setAccessible方法改成可见性 不然会报错
name.setAccessible(true);
//属性的设置 两个参数 第一个填入被设置的对象, 第二个设置被传进去的值,
//类似 类的属性.set( 被改变的对象, 改变的值 ); 其他同样
name.set(people,"小娟");
//测试属性值是否改变成功
System.out.println(people.toString());
//***********************************************************************************************************
//调用方法
//获取全特定的方法 方法名作为参数传进形参
Method getId = c.getDeclaredMethod(“getId”);
// invoke是执行方法的方法 两个参数 前一个是对象,后一个是参数,如果没有参数就不填,没有对象也可以不填
System.out.println(getId.invoke(people));
//获取全部的方法
Method[] Methods = c.getDeclaredMethods();
for (Method Method : Methods) {
}
} catch (Exception e) {
e.printStackTrace();
}
}
}