Java反射

本人零基础学Java,至今学了一个多月了,今天学完反射这一内容,就来和大家分享一下。

反射就是把java类中的各种成分映射成一个个的Java对象

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

可以先跳到最后看看学生类的内容有什么。

目录

一、获取class对象

二、获取构造方法

1.获取公共

2.获取私有

三、获取成员变量

1.获取公共成员变量

2.获取私有成员变量

四、获取成员方法

1.获取公共成员方法

2.获取私有成员方法

五、学生类内容


一、获取class对象

我们有三种方式获取class对象 1:使用类的cLass属性来获取该类对应的cLass对象。举例:Student.class将会返回student类对应的cLass对象。 2:调用对象的getClass()方法,返回该对象所属类对应的cLass对象。 该方法是object类中的方法,所有的Java对象都可以调用该方法。 3:使用cLass类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径。
我们主要使用第一和第三种方法。

其中Student是我创建的一个学生类,第三种是通过路径来访问类并创建对应的class对象。

//第一种        
        Class<Student> c1 = Student.class;

//第三种
        Class<?> c2 = Class.forName("myReflect.demo01.Student");

        System.out.println(c1 == c2);//这里通过输出可以得知两者是一样的

二、获取构造方法

我们的类里面的构造方法有公共的和私有的,他们的获取方法都不同。

1.获取公共

我们可以通过getConstructor()来获取公共构造方法(无参有参都可以)。

然后通过newInstance来把参数传入。

//创建class对象
Class<?> c = Class.forName("myReflect.demo01.Student");

//获取student类的构造方法
Constructor<?> con = c.getConstructor(String.class, int.class, String.class);

//输入参数
Object boj = con.newInstance("zs", 30, "gx");


System.out.println(boj);

2.获取私有

类中的私有构造方法是通过getDeclaredConstructor()来获取的,这个方法无论是公共还是私有都能获取到,建议后面都用这个方法。

在获取私有构造方法后,我们并不能直接使用,要通过另一个方法setAccessible(true)才能传入参数,括号里面填true就是为了取消访问检查。

Class<?> c = Class.forName("myReflect.demo01.Student");

//获取私有构造方法
Constructor<?> con = c.getDeclaredConstructor(String.class);

//暴力反射,值为true,取消访问检查
con.setAccessible(true);

//传入参数
Object obj = con.newInstance("zs");

.out.println(obj);

三、获取成员变量

这个和前面的构造方法差不多,同样有公共和私有。

1.获取公共成员变量

在这里,我们要用前面学到的获取构造方法来创建对象,然后去给成员变量赋值。

利用getField()可以获取公共成员变量。

Class<?> c = Class.forName("myReflect.demo01.Student");

//Field field = c.getField();获取公共成员变量
//Field fields[] = c.getDeclaredFields();//获取全部成员变量

//获取了公共成员变量 address
Field addressField = c.getField("address");

//获取无参构造方法创建对象
Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();

addressField.set(obj,"xi'an");//给obj的成员变量addressField赋值
System.out.println(obj);

2.获取私有成员变量

利用getDeclaredField()可以获取全部成员变量(包括私有)。

这里同样建议在后面学习工作中使用这种方法。

Class<?> c = Class.forName("myReflect.demo01.Student");


Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();

//获取私有成员变量 name
Field nameField = c.getDeclaredField("name");

//通过暴力反射,来取消访问检查
nameField.setAccessible(true);

//最后在给它赋值
nameField.set(obj,"zs");//给obj的私有成员变量nameField赋值
System.out.println(obj);

四、获取成员方法

1.获取公共成员方法

使用getMethod()方法来获取公共成员方法。

然后创建对象,利用invoke()方法来调用对象内的成员方法

Class<?> c = Class.forName("myReflect.demo01.Student");

Method method = c.getMethod();//获取公共成员方法 


Method m = c.getMethod("method1");//成员方法对象拿到了,但是还没创建对象

Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();

/*
在类或接口上提供有关单一方法的信息和访问权限
Object invoke (Object obj,object.. . args)在具有指定参数的指定对象上调用此方法对象表示的基础方法
object:返回值类型
obj:调用方法的对象
args:方法需要的参数*/

m.invoke(obj);

2.获取私有成员方法

这里利用getDeclaredMethod()方法来获取私有成员方法。

这里同样建议在后面学习工作中使用这种方法。

Class<?> c = Class.forName("myReflect.demo01.Student");

Constructor<?> con = c.getConstructor();
Object obj = con.newInstance();

//获取私有成员方法
Method m = c.getDeclaredMethod("function");

//暴力反射,取消访问检查
m.setAccessible(true);

//调用Student类中的私有成员方法
m.invoke(obj);

五、学生类内容

//成员变量,一个私有,一个默认,一个公共
    private String name;
    int age;
    public String address;

//构造方法,一个私有,一个默认,两个公共
    public Student() {
    }

    private Student(String name) {
        this.name = name;
    }

    Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

//成员方法,一个私有,三个公共
    private void function(){
        System.out.println("function");
    }
    public void method1(){
        System.out.println("method");
    }
    public void method2(String s){
        System.out.println("method:"+s);
    }
    public String method3(String s,int i){
        return s + "," + i;
    }

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

在此记录我的学习收获成果,如果对你有帮助那我很高兴。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值