欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中实现反射,以及利用反射实现调用已知class文件的方法和属性。

程序员文章站 2024-03-19 22:14:28
...

java反射的原理,以及利用反射实现调用已知class文件的方法和属性


-1.什么是java反射?
(1) 一个写好的java类文件,需要编译为class文件才可以在JVM中运行。
(2)而反射是指 程序jvm在运行时利用反射可以取得任何一个已知名称的class文件的内部信息。这些内部信息指的是,该类中的方法,属性,实现的接口,继承的父对象等。
(3)反射是从class文件中获取信息;反射在java运行(java)的时候使用;编译(javac)的时候不使用;
(4)所有反射相关的类:都在java.lang.Class和java.lang.reflect.Field和java.lang.reflect.method;

2.如何使用反射?
简单来说,使用反射就相当于你new了一个类的对象,当你需要使用这个类的某个方法或者属性的时候就利用一些列反射操作去调用这个属性或者方法,两者可以实现相同的效果,只不过区别是两者的机制不同。而大部分框架就是利用的反射原理。
首先,获取到class文件,一般采用Class.forname(包名+类名),或者 类名.class(一定要导入类所在的包),
目前本博主在河南卡尔信息实习,下面以两段代码为例:

A类:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class A
{
    public static void main(String[] args)
    {
        /*
         * 返回一个class对象
         */
        Class class1=B.class;
        try
        {
            //创建一个B类的对象
            Object obj = class1.newInstance();
            /*
             * 获取B类中的Amethod方法
             * 参数1是要调用方法的名称
             * 参数2是方法中形参的类型,无参直接写null,有参写参数的类型
             */
            Method method=class1.getMethod("Amethod", null);
            /*
             * 调用该方法并传参,
             * 参数1为创建的B的一个对象,
             * 参数2,调用的方法中形参的值,
             */
            method.invoke(obj, null);
            /*
             * 获取B类中的Amethod方法
             * 参数1是要调用方法的名称
             * 参数2是方法中形参的类型,无参直接写null,有参写参数的类型
             */
            Method method2=class1.getMethod("Amethod", String.class);
            /*
             * 调用该方法并传参,
             * 参数1为创建的B的一个对象,
             * 参数2,调用的方法中形参的值,
             */
            method2.invoke(obj, "亮哥帅啊");

        } catch (InstantiationException e)
        {

        } catch (IllegalAccessException e)
        {

        } catch (NoSuchMethodException e)
        {
            // TODO Auto-generated catch block

        } catch (SecurityException e)
        {
            // TODO Auto-generated catch block

        } catch (IllegalArgumentException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

B类:重载了两个Amethod方法,一个有参,一个无参。

public class B
{
    public void Amethod(String word)
    {
        System.out.println(word);
    }
    public void Amethod()
    {
        System.out.println("王天亮牛逼");
    }
}

代码执行结果:

java中实现反射,以及利用反射实现调用已知class文件的方法和属性。
以上为本次代码,向亮哥致敬!

上一篇: 网络分析利器:Tshark

下一篇: