java学习:反射

1.通过反射使用一个类

获取Class对象:

Class c1=student.class;

c1:就是student类的对象
返回值:class com.cn.student// student类的包名

student s=new student();
Class<?extends student> c3=s.getClass();//也是

Class<?> c4= Class.forName(“com.cn.student”);//也是

都可以返回类的:对象

在这里插入图片描述

package com.cn;

public class Dome2 {


    public static void main(String[] args) throws ClassNotFoundException {

        Class<student> c1=student.class;
        System.out.println(c1);

Class<student> c2=student.class;
System.out.println(c2);
System.out.println("----------");


student s=new student();

Class<?extends student> c3=s.getClass();
System.out.println(c3==c1);
        System.out.println("----------");


Class<?> c4= Class.forName("com.cn.student");
System.out.println(c4);


    }



}

结果:
在这里插入图片描述
控制台输出了:
在这里插入图片描述

2.反射:获取类构造方法:并使用:

Class<?> c1=Class.forName(“com.cn.student”);
Constructor<?>[] cons=c1.getConstructors();//获取类的对象中:public:的构造方法,cons:类:构造方法数组

Constructor<?>[] conu=c1.getDeclaredConstructors();//
获取所有构造方法
在这里插入图片描述

package com.cn;

import java.lang.reflect.Constructor;

public class Dome3 {


    public static void main(String[] args) throws ClassNotFoundException {




Class<?> c1=Class.forName("com.cn.student");


        Constructor<?>[] cons=c1.getConstructors();
        for(Constructor con:cons){//遍历Constructor对象数组
System.out.println(con);//con:数组中的元素
        }
        

    }
}

结果:返回public 公共的
在这里插入图片描述
补充:获取所有构造方法

 Constructor<?>[] conu=c1.getDeclaredConstructors();//返回所有构造方法:私有,公共都能

        for(Constructor con1:conu){//遍历Constructor对象数组
            System.out.println(con1);
        }

3.反射:获取构造方法并使用案例

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

Object obj=con.newInstance(“我是谁”,30,“北京”);
//创建object对象,并且
newInstance();//c\创建对象

其中类:

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


    }

    @Override
    public String toString() {
        return "student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
package com.cn;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class rtkfl {


    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {





        Class<?> c1=Class.forName("com.cn.student");

Constructor<?> con= c1.getConstructor(String.class,int.class,String.class);


Object obj=con.newInstance("我是谁",30,"北京");
System.out.println(obj);
    }



}

结果:

在这里插入图片描述

4.反射:获取成员变量并使用:

Field[] fields=c1.getDeclaredFields();//获取类成员变量(所有)

Field addressfild=c1.getField(“address”);//获取类特别一个成员变量

Constructor<?> con=c1.getConstructor();//getConstructor后面无s ,创建类对象
Object obj=con.newInstance();//创建object对象

addressfild.set(obj,“西安”);//给成员变量赋值
在这里插入图片描述

package com.cn;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

public class weryv {


    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {



        Class<?> c1=Class.forName("com.cn.student");


        Field[] fields=c1.getDeclaredFields();//Field获取类的成员变量,getDeclaredFields()返回所有:成员变量:公共的,私有的
        for(Field con:fields){  //for循环

            System.out.println(con);

        }

     System.out.println("--------------");

        Field addressfild=c1.getField("address");
       System.out.println(addressfild);
        System.out.println("--------------");

        Constructor<?> con=c1.getConstructor();//getConstructor后面无s

       Object obj=con.newInstance();

       System.out.println(obj);

addressfild.set(obj,"西安");//赋值:给成员变量,
System.out.println(obj);




    }
}

结果:
在这里插入图片描述

5.反射获取成员方法并使用:

Method[] methods=c1.getMethods();//获取类成员方法:public:公共的,数组

Method c2= c1.getMethod(“ass”);//获取类中某一个成员方法

Constructor<?> aaa=c1.getConstructor();//创建对象
Object obj=aaa.newInstance(); //利用object,创建object对象,
c2.invoke(obj);// 有指定参数的指定对象上调用此方法

在这里插入图片描述

package com.cn;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Dome4 {


    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {



        Class<student> c1=student.class;//创建反射对象


        Method[] methods=c1.getMethods();//获取类成员方法:public:公共的,数组

        for(Method con:methods){  //遍历methods数组

            System.out.println(con);
        }
System.out.println("--------------");


Method c2= c1.getMethod("ass");//获取类中某一个成员方法

System.out.println(c2);


        Constructor<?> aaa=c1.getConstructor();//创建对象
        Object obj=aaa.newInstance();  //利用object,创建object对象,


       c2.invoke(obj);//        获取的成员方法进行使用,invoke();是object中的一个方法:
        //具有指定参数的指定对象上调用此方法

    }







}

结果:
在这里插入图片描述

在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半浮名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值