所使用的实体类:
package reflect;
//定义一个学生类,作为测试项
public class Student {
private String id;
public int age;
String phone;
//无参构造方法
public Student(){}
//全参构造方法
public Student(String id, int age, String phone) {
super();
this.id = id;
this.age = age;
this.phone = phone;
}
//部分参数构造方法
public Student(String id, int age) {
super();
this.id = id;
this.age = age;
}
//私有的构造方法
private Student(String id) {
super();
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
//定义一个Public方法
public void showPublic(){
System.out.println("我是公有的方法");
}
//定义一个私有的方法
private void showPrivate(){
System.out.println("我是私有的方法");
}
//定义一个受保护的方法
protected void showProtected(){
System.out.println("我是受保护的方法");
}
//定义一个默认的方法
void show(){
System.out.println("我是默认的方法");
}
//定义一个有返回值的方法
public String showReturn(){
return "我是有返回值的方法";
}
@Override
public String toString() {
return "Student [id=" + id + ", age=" + age + ", phone=" + phone + "]";
}
}
反射操作:
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
//进行测试属性
public class TestFiled {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// 获取类运行时对象方法一
Class<Student> student = Student.class;
// 方法二
//注意此处吃的名字其实是一个字符串,但这个字符串必须是目标类的全路径:包名+类名
Class<?> studnet1 = Class.forName("day31reflect.Student");
// 方法三,调用Object的方法
Student s = new Student();
Class<?> student2 = s.getClass();
// 获取当前所指向的字节码的名字
String name = student.getName();
System.out.println(name);
System.out.println("----------1-------------------");
// 获取属性信息
//获取属性的方法getFields()
Field[] fields1 = student.getFields(); //获得的只是public 类型的
for (Field field : fields1) {
System.out.println(field);
}
System.out.println("----------2---------------------");
//如何获取所有属性的全部信息呢? 应用getDeclaredFields(),获取的是具体的属性:包括修饰符、类型、属性名字
Field[] fields = student.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("-----------3-----------------------");
//如何获取其中某一个属性,需要通过类来查找 getDeclaredField(String name)
Field field1 = null;
try {
field1 = student.getDeclaredField("age");
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//打印
System.out.println(field1);
System.out.println("--------------4-----------------------");
//如何获取每一个属性的修饰符? 应用getModifiers(),返回值是一个int
for (Field field : fields) {
int mod = field.getModifiers();
System.out.println("修饰符为:"+mod+"\t"+Modifier.toString(mod));
//将返回值转换为具体的修饰符,用其具体的修饰符类Modifier,再通过toString(mod)方法实现
}
System.out.println("----------------5---------------------");
//如何获取每一个属性的返回值 应用getType()
for (Field field : fields) {
Class<?> type = field.getType();
System.out.println("返回值为:"+type);
}
System.out.println("-------------------6---------------------");
//如何获取属性名字
for (Field field : fields) {
String str=field.getName();
System.out.println("属性名字为:"+str);
}
System.out.println("-----------------7--------------------");
//设置属性值,需要通过构造方法来设置
//获取对应参数的构造器,如果不存在这样的构造器,则会报出NoSuchMethodException
Constructor<Student> stu = student.getDeclaredConstructor(String.class,int.class,String.class);
//修改访问权限
stu.setAccessible(true);
//创建对象
Student st = stu.newInstance("001",21,"18341******");
System.out.println(st);
System.out.println("----------------8-----------------------");
}
}