关于Class和java的反射

简介: 关于Class和java的反射

class的意义


作为程序运作过程中用于标识和维护某个类运行时候的状态,可以通过反射来获取到相应的对象属性。这个Class和我们常见的class还是有所区别的,前者更多的是保存运行时的类信息,后者则只是一个关键字而已。


反射的理解


反射是一种可以获取jvm里面动态信息的加载方式。反射的优点在于可以动态化地加载类的属性和方法,是java语言中比较灵活的一种特性。但是反射也有他自己的缺点,毕竟需要提前进行编译的代码才能被反射操作,操作效率上会慢于直接操作java程序。


通过class我们最常用的就是反射技巧,可以借助反射来获取类里面我们所需要的变量,方法,构造函数等信息,同时我们还可以借助反射来进行类的实例化操作。


接下来我们闲话不多说,直接写一个demo来进行总结和归纳


import org.junit.Before;
import org.junit.Test;
import 自定义类加载器.User;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 * @author idea
 * @data 2019/2/12
 */
public class ReflectTest {
    User user;
    Class userClass;
    @Before
    public void setUp() {
        user = new User("idea", "pwd");
        userClass = user.getClass();
    }
    /**
     * 获取包名和类名
     */
    @Test
    public void getClassAndPackageName() {
        System.out.println(userClass.getName());
    }
    /**
     * 获取单独的类名
     */
    @Test
    public void getClassName() {
        System.out.println(userClass.getSimpleName());
    }
    /**
     * 获取数组名称
     */
    @Test
    public void getComponentName() {
        String[] arr = {"asd", "vbbb"};
        System.out.println(arr.getClass().getComponentType());
    }
    /**
     * 获取方法名称的数组
     */
    @Test
    public void getFieldAndMethods() {
        //获取所有的方法 包括父类信息
        Method[] methods = userClass.getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
        //获取所有的属性 包括父类信息
        Field[] fields = userClass.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
    }
    /**
     * 返回全部构造器数组,无论是public/private还是protected,不包括超类的成员
     */
    @Test
    public void getDeclaredConstructors() {
        Constructor[] constructors = userClass.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getParameterCount());
        }
    }
    /**
     * 获取当前类的修饰符
     */
    @Test
    public void getModifiers() {
        int status = userClass.getModifiers();
        System.out.println(status);
    }
    /**
     * 创建类实例的方式
     *
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     */
  @Test
public void classNewInstance() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
    Class c1 = Class.forName("java.lang.Integer");
    String str = (String) Class.forName("java.lang.String").newInstance();
    Constructor c2 = Class.forName("java.lang.String").getDeclaredConstructor();
    c2.setAccessible(true);
    String st1 = (String) c2.newInstance();
    Constructor c3 = Class.forName("java.lang.String").getDeclaredConstructor(new Class[]{String.class});
    c3.setAccessible(true);
    String str2 = (String) c3.newInstance("idea");
    System.out.println(str2);
}
}


目录
相关文章
|
11月前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
144 5
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
237 9
Java——反射&枚举
|
Java
java基础(4)public class 和class的区别及注意事项
本文讲解了Java中`public class`与`class`的区别和注意事项。一个Java源文件中只能有一个`public class`,并且`public class`的类名必须与文件名相同。此外,可以有多个非`public`类。每个类都可以包含一个`main`方法,作为程序的入口点。文章还强调了编译Java文件生成`.class`文件的过程,以及如何使用`java`命令运行编译后的类。
513 3
java基础(4)public class 和class的区别及注意事项
|
Java
Java的反射
Java的反射。
129 2
|
Java 编译器 Maven
Java“class file contains wrong class”解决
当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
352 3
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
468 3
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
190 2
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
130 1
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
264 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
下一篇
oss云网关配置