反射的操作

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//import java.lang.reflect   和反射相关的包

class Student {
    private String name;   //私有属性
    public int age;  //共有属性

    //公共的构造方法
    public Student(){
        int a = 10;
        System.out.println("Student()");
    }

    //私有的构造方法
    private Student(String name, int age){
        this.name = name;
        this.age = age;
        System.out.println("Student(name,age)");
    }

    //私有方法
    private void eat() {
        System.out.println("正在吃");
    }

    //共有的方法
    public void run() {
        System.out.println("正在跑");
    }

    //带一个参数的私有的方法
    private void function(String str) {
        System.out.println(str);
    }

    //重写的方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class Test2{

    //创建对象
    public static void create() {
        try {
            Class<?> c1 = Class.forName("Student");   //获得class对象
            Object objectStudent = c1.newInstance();    //创建类的实例,调用不带有参数的构造方法
            Student student = (Student)objectStudent;
            System.out.println("获得student对象"+student);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //反射私有的构造方法
    public static void reflectPrivateConstructor() {
        try {
            Class<?> c2 = Class.forName("Student");   //获得class对象
            Constructor<?> constructor = c2.getDeclaredConstructor(String.class,int.class);  //构造方法的两个参数
            //反射私有的属性或者方法的时候,都需要修改访问权限
            constructor.setAccessible(true);
            Object object = constructor.newInstance("盛慧",20);   //调用构造方法
            Student student = (Student)object;
            System.out.println("获得私有的构造函数并且修改年龄和姓名: "+student);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //反射私有属性
    public static void reflectPrivateField() {
        try {
            Class<?> c3 = Class.forName("Student");
            Field field = c3.getDeclaredField("name");
            field.setAccessible(true);
            Object object = c3.newInstance();
            Student student = (Student)object;

            field.set(student,"小明");

            String name = (String)field.get(student);
            System.out.println("修改了私有属性name:"+name);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //反射私有方法
    public static void reflectPrivateMethod() {
        try {
            Class<?> c4 = Class.forName("Student");
            Method method = c4.getDeclaredMethod("function",String.class);   //私有方法的名称和方法参数
            System.out.println("私有方法的名称为:"+method.getName());
            method.setAccessible(true);
            Object object = c4.newInstance();
            Student student = (Student)object;
            method.invoke(student,"给私有的函数传的参数");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        //create();
        //reflectPrivateConstructor();
        //reflectPrivateField();
        reflectPrivateMethod();



/*        //通过getClass获得class对象
        Student s1 = new Student();
        Class<?> c1 = s1.getClass();

        //通过类名.class获得class对象
        Class<?> c2 = Student.class;

        //通过Class对象的forName()静态方法来获取
        Class<?> c3 = null;
        try {
            Class.forName("Student");   //可能会抛出异常,所以用try catch包裹
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


        System.out.println(c1.equals(c3));
        System.out.println(c1.equals(c3));
        System.out.println(c2.equals(c3));*/
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值