java反射理解

想要理解java反射机制的含义,应该再了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行,java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。简单说,反射机制值得是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。

java反射机制提供了如下的功能:在运行时能够判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任一对象的方法;在运行时创建新类对象。

需要知道的是,反射也有缺点。反射机制的功能非常强大,但不能滥用。一是因为性能问题,Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。二是安全限制,使用反射通常需要程序的运行没有安全方面的限制,如果一个程序对安全性提出要求,则最好不要使用反射。

Java反射机制为程序很大程度上的提高了灵活性和扩展性,可以节省很多资源,反射机制是java这种动态语言一个关键,所以零基础的朋友们在初始学习的时候,对java反射机制有通透的理解的话,在java视频教程中学习关于反射的内容,肯定是会有所帮助的。
 

package omg;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: DIXian
 * @Date: 2021/06/28/23:48
 */
public class Test22 {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class clazz = Person.class;
        //需要提供自定义类的构造方法
        Constructor tom = clazz.getConstructor(String.class, int.class);

        Object tom1 = tom.newInstance("Tom", 12);
        Person p = (Person) tom1;
        System.out.println(p.toString());
        //调用属性
        Field age = clazz.getDeclaredField("age");
        age.set(p,15);
        System.out.println(p.toString());
        //调用方法
        Method show = clazz.getDeclaredMethod("show");
        show.invoke(p);



    }
}
class Person{
    String name;
    int age;

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

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public void show(){
        System.out.println("我是你哥哥");
    }
}

 

通过反射获取Class实例的方法

上代码:

package omg;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: DIXian
 * @Date: 2021/06/29/23:37
 */
public class Test23 {
    public static void main(String[] args) throws ClassNotFoundException {
        //通过反射获取Class实例的方法
        //第一种:通过调用运行时类的属性.class

        Class clazz = Person1.class;
        //第二种:通过对象实例调用getclass()方法

        Person1 person1 = new Person1();
        Class aClass = person1.getClass();
        //第三种Class类的静态方法:forName()方法

        Class aClass1 = Class.forName("omg.Person1");
        System.out.println(clazz == aClass);
        System.out.println(clazz == aClass1);
        System.out.println(clazz);
        //第四种,通过类的加载器调用loadClass()方法

        ClassLoader classLoader = Person1.class.getClassLoader();
        Class aClass2 = classLoader.loadClass("omg.Person1");
        System.out.println(clazz == aClass2);

    }
}
class Person1{
    String name;
    int age;

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

    public Person1() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谛仙0

本人已实现,编写不易

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

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

打赏作者

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

抵扣说明:

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

余额充值