梳理Java中关于反射的知识

news/2024/5/19 3:41:09 标签: 反射, java

javalangClass_0">如何获取java.lang.Class实例?

方式一
java">Class<Person> clazz = Person.class;
方式二
java">Person person = new Person("Apollo");
Class<? extends Person> clazz = person.getClass();
方式三 (常用)
java">Class<?> clazz = Class.forName("fun.gosuncn.Person");
方式四
java">ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class<?> clazz = classLoader.loadClass("fun.gosuncn.Person");

类的加载过程

加载:将字节码文件加载到内存。
链接:验证、准备、解析。
初始化:执行类构造器<clinit>()方法的过程。
java">class A {
  static {
    a = 100;
  }
  static int a = 10;
}

链接的过程中,a = 0;在初始化过程中,因为static代码块static int a = 10;前面所以先执行,那么 a = 10;若static代码块static int a = 10;后面,则 a = 100。

类的加载器

BootStrap ClassLoader 引导类加载器。加载java核心类,如String类,由引导类加载器进行加载。

Extension ClassLoader 扩展类加载器。加载jre/lib/ext目录下的jar包。

System ClassLoader 系统类加载器。加载自定义的类。

也可以自定义类的加载器。

类加载器加载配置文件

java">public class Test {
    public static void main(String[] args) throws Exception {
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        // 默认加载路径是src目录(类路径)
        InputStream inputStream = classLoader.getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        Object user = properties.get("user");
        System.out.println("user = " + user);
    }
}

创建运行时类的对象

java">Class clazz = Person.class;
Object object = clazz.newInstance(); // 使用默认的无参构造函数

使用Class实例的newInstance()方法创建对象:必须满足:必须提供有访问权限的无参构造函数

获取运行时类的属性

java">/**
 * 获取运行时类及其父类中声明为public的属性
 */
Field[] fields = clazz.getFields();
java">/**
 * 获取运行时本身类所有属性
 */
Field[] fields = clazz.getDeclaredFields();
java">/**
 * 获取修饰符权限
 */
int modifiers = field.getModifiers();
String modifierString = Modifier.toString(modifiers);
java">/**
 * 获取属性类型
 */
Class<?> type = field.getType();
java">/**
 * 获取属性名
 */
String name = field.getName();

获取运行时类的方法

java">/**
 * 获取运行时类及其父类中声明为public的方法
 */
Method[] methods = clazz.getMethods();
java">/**
 * 获取运行时本身类所有的方法
 */
Method[] methods = clazz.getDeclaredMethods();
java">/**
 * 获取修饰符权限
 */
Modifier.toString(method.getModifiers())
java">/**
 * 获取全部注解
 */
Annotation[] annotations = method.getAnnotations();
java">/**
 * 获取返回值类型
 */
method.getReturnType()
java">/**
 * 获取方法名
 */
method.getName()

获取运行时类的构造方法

java">/**
 * 获取运行时类中声明为public的构造方法
 */
Constructor<?>[] constructors = clazz.getConstructors();
java">/**
 * 获取运行时类中全部构造方法
 */
Constructor<?>[] constructors = clazz.getDeclaredConstructors();

获取运行时类的父类

java">Class<?> superclass = clazz.getSuperclass();

获取运行时类的带泛型父类

java">Type type = clazz.getGenericSuperclass();

获取运行时类的带泛型父类的泛型

java">Type type = clazz.getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] types = parameterizedType.getActualTypeArguments();

获取运行时类实现的接口

java">Class<?>[] interfaces = clazz.getInterfaces();

获取运行时类的包

java">Package packageX = clazz.getPackage();

http://www.niftyadmin.cn/n/923333.html

相关文章

梳理Java中关于集合的知识

常见接口简介 List 有序、可重复 ArrayList 查改速度快&#xff0c;初始大小10&#xff0c;扩容一次是原来的1.5倍。 LinkedList 增删速度快&#xff0c;双向链表结构。 Vector 线程安全&#xff0c;初始大小10&#xff0c;扩容一次是原来的2倍。其他集合可通过java.util.Colle…

Tomcat解压目录中RUNNING.txt文件中英对照

首先&#xff0c;将官网的安装包先下载并解压到磁盘目录中。官网https://tomcat.apache.org/download-80.cgi链接。如上图&#xff0c;最后一行有个文件&#xff0c;名叫RUNNING&#xff0c;接下来的内容就是关于它的了。 文中提到&#xff1a; JDK版本需在7及以上。设置环境…

刚下载的Tomcat启动起来控制台的日志乱码问题解决

如下图(左)所示&#xff0c;双击文件startup.bat启动tomcat&#xff0c;发现日志是乱码的&#xff0c;如下图(右)所示。 解决很简单&#xff0c;肯定就是日志编码的问题呗&#xff01;来&#xff0c;打开文件logging.properties&#xff0c;位置在下图(左)所示。 并修改第47行…

Tomcat中apache-tomcat-8.5.60\conf\server.xml文件的配置说明

Tomcat默认的server.xml配置 <?xml version"1.0" encoding"UTF-8"?><Server port"8005" shutdown"SHUTDOWN"><!-- 监听8005端口,监听关闭命令 --><Listener className"org.apache.catalina.startup.Vers…

Tomcat中apache-tomcat-8.5.60\conf\web.xml文件的配置说明

默认web.xml配置 默认的配置中&#xff0c;有2个servlet配置。default和jsp两个servlet。 default处理默认请求&#xff0c;拦截<url-pattern>/</url-pattern>请求。 jsp处理JSP请求&#xff0c;拦截<url-pattern>*.jsp</url-pattern>和<url-pat…

Tomcat中apache-tomcat-8.5.60\conf\tomcat-users.xml文件的配置说明

要想使用自带的管理&#xff0c;需要配置tomcat-users.xml文件&#xff01; <?xml version"1.0" encoding"UTF-8"?> <tomcat-users xmlns"http://tomcat.apache.org/xml"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

Tomcat支持HTTPS

既然使用HTTPS协议&#xff0c;那就得创建一个证书文件。 使用JDK自带的工具keytool命令来创建&#xff1a; keytool -genkey -alias gosuncn -keyalg RSA -keystore gosuncnkey.keystore我们将口令&#xff0c;填写成gosuncn即可&#xff0c;你根据你的需求更改&#xff0c;但…

Tomcat中WebSocket的使用

创建一个简单的Web项目&#xff0c;后端代码 import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet;ServerEndpoint("/test") public cl…