我是靠谱客的博主 听话秋天,最近开发中收集的这篇文章主要介绍Java 反射 (快速了解反射),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

反射的概念

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

Java反射有三个动态性质:
1、运行时生成对象实例
2、运行期间调用方法
3、运行时更改属性
通过这些动态性质,JAVA反射可以在程序运行时获取对象和类的真实信息。

Java反射可以实现的功能:
1、在运行时判断任意一个对象所属的类
2、在运行时构造任意一个类的对象
3、在运行时判断任意一个类所具有的方法和属性
4、在运行时调用任意一个对象的方法
5、生成动态代理
 

与Java反射相关的类如下:

类名用途
Class类代表类的实体,在运行的Java应用程序中表示类和接口
Field类代表类的成员变量(成员变量也称为类的属性)
Method类代表类的方法
Constructor类代表类的构造方法

 

Class类

 

 

假如现在有一个私有的student 方法 想调用这个方法就可以使用反射

一个student 类如下

public class Student {
    private String name;
    private int age;
    private Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student(){
        throw new IllegalAccessError("就不给你创建");
    }
    private String getName() {
        return name == null ? "" : name;
    }
    private 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 "Student{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

 

实现如下

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Fine{
    public static void main(String[] args){

        Class<?> clz = null;
        try {
            clz = Class.forName("Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 找到带有这个参数的构造方法
        Constructor constructor = null;
        try {
            constructor = clz.getDeclaredConstructor(String.class, int.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        constructor.setAccessible(true);
          // 初始化对象
        Object student = null;
        try {
            student = constructor.newInstance("张三", 18);
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println("--------------"+constructor.toString());

       // 找到该私有方法
        Method getName = null;
        try {

            getName = clz.getDeclaredMethod("getName");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        getName.setAccessible(true);
        String name = null;
        try {
            name = (String) getName.invoke(student);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        System.out.println("--------------"+name);

        // 找到私有属性
        Field age = null;
        try {
            age = clz.getDeclaredField("age");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        age.setAccessible(true);
        try {
            age.setInt(student, 20);   // 修改属性
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        try {
            System.out.println("--------------"+age.get(student));
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }
}

输出结果:

最后

以上就是听话秋天为你收集整理的Java 反射 (快速了解反射)的全部内容,希望文章能够帮你解决Java 反射 (快速了解反射)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部