java反射

2024-01-03 19:48:07

一、介绍:

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

2、四维导图:

?

二、获取class类:

1、前提:Class本身也是一个类;Class对象只能由系统建立对象;一个加载的类在JVM中只会有一个Class实例;一个Class对象对应的是一个加载到JVM中的一个.class文件;每个类的实例都会记得自己是由哪个Class实例所生成;通过Class可以完整地得到一个类中的所有被加载的结构;Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class对象。

2、反射获取Class类的几种方法:

(1)若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高

Class class = User.class;

(2)已知某个类的实例,调用该实例的getClass()方法获取Class对象

Class class = user.getClass();

(3)已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException

Class class = Class.forName("reflect.User")

(4)内置基本数据类型可以直接用类名.Type

(5)还可以利用ClassLoader。

3、哪些类型可以有class对象:

  • class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
  • interface:接口
  • []:数组
  • enum:枚举
  • annotation:注解@interface
  • primitive Type:基本数据类型
  • void

二、获取类运行时的结构:通过反射获得运行时类的完整结构,包括Field,Method(方法),Constructor(构造器),Superclass(父类),Interface,Annotation(注解)。

package reflect;

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

//获取类的信息
public class Test07 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
       Class c1 = Class.forName("reflect.User");

//        User user = new User();
//        Class c1 = user.getClass();

        //获取类的名字
        System.out.println("获取类的名字-----------------------------------------------------");
        System.out.println(c1.getName());//获取包名+类名
        System.out.println(c1.getSimpleName());//获取类名

        //获取类的属性
        System.out.println("获取类的属性-----------------------------------------------------");
        Field[] fields = c1.getFields();//只能找到public属性
        fields = c1.getDeclaredFields();//找到全部的属性
        for (Field field : fields) {
            System.out.println(field);
        }
        //获得指定属性的值
        Field name = c1.getDeclaredField("name");
        System.out.println(name);

        //获得类的方法
        System.out.println("获取类的方法-----------------------------------------------------");
        Method[] methods = c1.getMethods();
        for (Method method : methods) {
            System.out.println("公共的:"+method);//获得本类及其父类所有的public方法
        }
        methods = c1.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("全部的:"+method);//获得本类全部方法
        }
        //获得指定方法
        Method getName = c1.getMethod("getName",null);
        Method setName = c1.getMethod("setName", String.class);
        System.out.println(getName);
        System.out.println(setName);

        //获得类的构造器
        System.out.println("获取类的构造器-----------------------------------------------------");
        Constructor[] constructors = c1.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        constructors = c1.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println("##"+constructor);
        }
        //获得类的指定构造器
        Constructor DeclaredConstructor = c1.getDeclaredConstructor(String.class,int.class,int.class);
        System.out.println("指定的:"+DeclaredConstructor);
        
    }
}

文章来源:https://blog.csdn.net/w_t_y_y/article/details/135363001
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。