java学习笔记:反射详解

Java反射机制:

指在运行状态中,对于任意一个类,都能拿到这个类的所有属性和方法;对于任意一个对象,都能够使用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
可以直接理解为:反射可以实现在运行时可以知道任意一个类的属性和方法。

为什么要使用反射

首先要理解静态编译和动态编译

静态编译:在编译时就确定类型和对象

动态编译:在运行是才确定类型和对象,发挥了java的灵活性及多态的应用,动态创建对象和编译,一个应用可以在不卸载的情况下利用反射机制实现动态的编译,当然对性能也会有影响

class类

类是java.lang.Class 的实例,类又是class类的实例但是虽然能直接

String s = new String ("name")

创造一个实例 但是我们不能直接

Class c = new Class();因为构造器是私有的,只有虚拟机能创建Class对象,虽然我们不能new一个Class对象,但是可以通过有的类来得到这个创建的Class对象

先创建一个对象


class Animal{
    String name;
    String sex;
    public String age;
    public static void say(){
        System.out.println("我能说人话!");
    }
    public void name(){
        System.out.println("我的名字叫"+name);
    }
     Animal(){
    }
    Animal(String name,String sex,String age){
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

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

获取Class 的三个方法:

1.通过类的静态变量class获取

2.知道完整类名,可以通过Class的forName静态方法直接获取

3已经有了实例,通过实例的静态方法getClass获取

        Class clazz1 = Animal.class;
        Class clazz2 = Class.forName("Animal");
        Animal wc = new Animal();
        Class clazz3 = wc.getClass();
System.out.println(clazz1+" "+clazz2+" "+clazz3);
//打印结果:class Animal class Animal class Animal

不想要前面带class可以直接给获取的类名.forName就没有class了

得到类后就可以获取类中几乎所有想要的了

通过类获取字段、方法、结构体

字段

Field [] fs = clazz1.getFields();//获取所有public的field字段包括父类的
Field f = clazz1.getField("age")//获得指定的field字段包括父类的;
Field [] fil = clazz1.getDeclaredFields();//获取当前类的public和private字段
Field file = clazz1.getDeclaredField("age");//获得当前类指定的public和private的field
//遍历字段数组
for (Field ff:fds) {
            System.out.println(f);
     }

 Method [] fil = clazz1.getDeclaredMethods();//获取当前类的public和private字段
 Method file = clazz1.getDeclaredMethod("name");//获得当前类指定的public和private的Method
 Method [] fs = clazz1.getMethods();//获取所有public的Method字段包括父类的
 Method f = clazz1.getMethod("say");//获得指定的Method字段包括父类的;
//
//Method d = str.getClass().getMethod("substring", int.class);
//嗲用这个方法并且打印 System.out.println( d.invoke(str,2));
//因为我自己写的写的方法少这里举个例字:这个是调用String 里面的substring ,前面写要掉的方法,后面// //填写参数
f.invoke(wc);//调用方法,第一个参数为实例,如果是静态方法的话,实例位置填写 null,后面填写参数
//编辑器可能会报错,要有个try catch捕获异常
//遍历同上 Field改为MeThod

结构体


    Constructor [] constr = String.class.getDeclaredConstructors();
    Constructor cl = String.class.getDeclaredConstructor(String.class);
     Constructor con = clazz1.getConstructor(Dog.class);
    Constructor c = String.class.getConstructors();//带s和不带s的字段,方法的一样
    
//创建方法实例
        Constructor[] cons = clazz1.getConstructors();
       Dog mm = (Dog) con.newInstance("f","fd","fsd");

,还可以获取很多例如接口,父类等等,这里就不介绍了,一般初学这个先掌握这些,再慢慢进阶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值