文章目录
反射概念
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制 文末有完整代码
实例化class类的三种方法:
1:对象.getClass( )
eg:
Class<? extends Teacher> c1 = teacher.getClass();
2:类.Class
eg:
Class c2 = Teacher.class;
3:forName(该方法会抛出异常,需要与try-catch连用)
eg:
Class<?> c3 = null;
try{
c3 = Class.forName(“com.example.bootopen.com.reflex.Teacher”); //这个路径得写全,写自己的
}catch (ClassNotFoundException e){
e.printStackTrace();
}
Class类的应用
newInstance()方法
用于创建Class类对象的新实例
eg:
try{
Teacher s =(Teacher) c3.newInstance(); //newInstance方法会抛异常,就得try-catch了
}catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
获取类的构造方法
Constructor<?>[] cons = c3.getConstructors();
System.out.println("7 "+Arrays.toString(cons));
获取类所实现的接口
Class<?>[] in = c1.getInterfaces();
System.out.println("8 "+Arrays.toString(in));
取得父类
Class<?> su = c3.getSuperclass();
System.out.println("9 "+su);
取得类中的全部方法
Method[] m = c3.getMethods();
System.out.println("10 "+Arrays.toString(m));
取得类中的全部属性
Field[] f = c3.getDeclaredFields();//getFields()只能获取公共属性
System.out.println("11 "+Arrays.toString(f));
取得类中的属性值
公有
try {
Field f1 = c3.getField("name");
System.out.println("12 "+ f1.get(teacher));
//通过反射修改属性
f1.set(teacher,"张三");
System.out.println("12-1 "+ f1.get(teacher));
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
私有
Field f2 = null;
try {
f2 = c3.getDeclaredField("age");
//age是私有属性,所以要设置安全检查为true
f2.setAccessible(true);
System.out.println("13 "+f2.get(teacher));
//通过反射修改属性
f2.set(teacher,999);
System.out.println("13-1 "+f2.get(teacher));
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
完整代码
1:Teacher.java
public class Teacher {
public String name;
private int age;
private String sex;
public Teacher() {
}
public Teacher(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getSex() {
return sex;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
2:Reflex.java
public class Reflex {
public static void main(String[] args) throws IllegalAccessException {
Teacher teacher = new Teacher("字母",22,"男");
System.out.println("1 "+teacher.getClass());//显示的是class(所有对象都是class类的实例) 和 对应的类
System.out.println("2 "+teacher.getClass().getName()); //能找到对应类
//class类没有构造方法,然后实例化class类有三种方法
//对象.getClass( )
Class<? extends Teacher> c1 = teacher.getClass();
System.out.println("3 "+c1);
//类.Class
Class<Teacher> c2 = Teacher.class;
System.out.println("4 "+c2);
//forName( ) 该方法会抛出异常
Class<?> c3 = null;
try{
c3 = Class.forName("com.example.bootopen.com.reflex.Teacher"); //这个路径得写全
}catch (ClassNotFoundException e){
e.printStackTrace();
}
System.out.println("5 "+c3);
//Class类的应用 newInstance()方法 用于创建Class类对象的新实例
try{
Teacher s =(Teacher) c3.newInstance(); //newInstance方法会抛异常,就得try-catch了
System.out.println("6 "+s);
}catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//获取类的构造方法
Constructor<?>[] cons = c3.getConstructors();
System.out.println("7 "+Arrays.toString(cons));
//获取类所实现的接口
Class<?>[] in = c1.getInterfaces();
System.out.println("8 "+Arrays.toString(in));
//取得父类
Class<?> su = c3.getSuperclass();
System.out.println("9 "+su);
//取得类中的全部方法
Method[] m = c3.getMethods();
System.out.println("10 "+Arrays.toString(m));
//取得类中的全部属性
Field[] f = c3.getDeclaredFields();//getFields()只能获取公共属性
System.out.println("11 "+Arrays.toString(f));
//取得类中的属性值
//公有
try {
Field f1 = c3.getField("name");
System.out.println("12 "+ f1.get(teacher));
//通过反射修改属性
f1.set(teacher,"张三");
System.out.println("12-1 "+ f1.get(teacher));
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
//私有
Field f2 = null;
try {
f2 = c3.getDeclaredField("age");
//age是私有属性,所以要设置安全检查为true
f2.setAccessible(true);
System.out.println("13 "+f2.get(teacher));
//通过反射修改属性
f2.set(teacher,999);
System.out.println("13-1 "+f2.get(teacher));
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}