反射实战入门


反射概念

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();
    }
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值