0
点赞
收藏
分享

微信扫一扫

建议看看这篇关于Java 反射机制的讲解,写的非常详细

Java反射机制:

反射机制可以允许我们实例化一个类,调用方法操作属性从编码器改为运行期决定。并且也可以在运行期间动态的得知一个类的情况(它有哪些方法和属性等)。

反射机制可以大大提高代码的灵活度,但是实际开发中使用要适度,过渡使用反射会降低代码的运行效率。

反射第一步:获取要操作的类的类对象

Java中每个被JVM加载的类在JVM内部都有且只有一个类对象(Class实例),与之对应。通过某个类的类对象可以得知这个类的信息(有哪些方法,哪些属性等等信息)并且可以进行实例化等操作。

想获取一个类的类对象方式:

1)类型.class

每个类都有一个静态属性:class,可以直接获取这个类的类对象。当我们直接获取这个类的类对象,当我们明确需要获取某个类的类对象时可以使用这种方式。

2)通过Class的静态方法:forName,这种方式我们可以指定想加载的类的名字来获取该类的类对象。

3)通过类加载器ClassLoader

package reflect;

import java.lang.reflect.Method;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //查看Person类的信息
        /*
         * 1:先获取Person的类对象
         */
        //Class cls = Person.class;
        /*
         * Class.forName(String className)
         * 这里在加载一个类时指定的字符串为加载类的
         * 完全限定名:包名.类名
         */     
        Class cls = Class.forName("reflect.Person");
        String name = cls.getName();
        System.out.println(name);
        
        Method[] methods = cls.getMethods();
        for(Method method:methods) {
            System.out.println(method.getName());
        }
    }
}

通过类对象快速创建实例:Object obj = cls.newInstance();

package reflect;

import java.util.Scanner;

/**
 * 通过类对象快速创建实例
 * @author ta
 *
 */
public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        /*
         * 实例化Person
         */
        Person p = new Person();
        System.out.println(p);
        /*
         * 利用反射
         */
        Scanner scanner = new Scanner(System.in);
        Class cls = Class.forName(scanner.nextLine());
        /*
         * java.util.Date
         * java.util.ArrayList
         * 
         * Class有一个快速实例化对象的方法:
         * newInstance()
         * 但是需要注意,该Class实例表示的类必须要
         * 包含无参构造方法,否则不能使用这种方式
         * 实例化
         */
        Object obj = cls.newInstance();
        System.out.println(obj);
    }
}

利用反射调用方法:

package reflect;

import java.lang.reflect.Method;

/**
 * 利用反射调用方法
 * @author ta
 *
 */
public class ReflectDemo3 {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        p.sayHello();
        /*
         * 利用反射
         */
        //1 加载类对象
        Class cls = Class.forName("reflect.Person");
        //2 实例化
        Object o = cls.newInstance();
        
        /*
         * 3通过类对象获取其定义的方法
         * Method的每一个实例用于表示一个类中
         * 的一个具体的方法
         */
        Method method = cls.getMethod("sayHello",null);
        /*
         * 4调用该方法
         */
        method.invoke(o, null);
    }
}

调用有参方法:

package reflect;

import java.lang.reflect.Method;

/**
 * 调用有参方法
 * @author ta
 *
 */
public class ReflectDemo4 {
    public static void main(String[] args) throws Exception {
        /*
         * Person p = new Person();
         */
        Class cls = Class.forName("reflect.Person");
        Object o = cls.newInstance();
        /*
         * p.sayHello("张三");
         * 
         * 1:获取Person的sayHello方法
         *   void sayHello(String)
         */
        Method method = cls.getMethod(
            "sayHello", String.class
        );
        /*
         * 2:调用o这个对象的sayHello方法并
         *   传入实际参数
         */
        method.invoke(o, "张三");
        /*
         * p.sayHello("李四",22)
         */
        Method method2 = cls.getMethod(
            "sayHello", String.class,int.class
        );
        method2.invoke(o,"李四",22);  
    }
}

测试反射功能的类:

package reflect;
/**
 * 测试反射功能的类
 * @author ta
 *
 */
public class Person {
    public void sayHello() {
        System.out.println("hello!");
    }
    
    public void sayHello(String name) {
        System.out.println("hello!"+name);
    }
    public void sayHello(String name,int age) {
        System.out.println("hello!"+name+",您今年"+age+"岁.");
    }
    
    public void sayHi() {
        System.out.println("hi!");
    }
}

最后

感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

举报

相关推荐

关于Java的反射机制。

0 条评论