「Java 知识点详解 8」Java 反射机制,java 项目经验面试题
2021/11/10 17:12:08
本文主要是介绍「Java 知识点详解 8」Java 反射机制,java 项目经验面试题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、类的主动引用(一定会发生类的初始化)
- 当虚拟机启动,先初始化 main 方法所在的类;
- new 一个类的对象;
- 调用类的静态成员(除了 final 常量)和静态方法;
- 使用 java.lang.reflect 包的方法对类进行反射调用;
- 当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类;
二、类的被动调用(不会发生类的初始化)
- 当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化;
- 通过数组定义类引用,不会触发此类的初始化;
- 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了);
三、类加载器的作用
将 class 文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的 java.lang.Class 对象,作为方法区中类数据的访问入口。
四、动态创建对象执行方法
//java学习交流737251827 package com.reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test03 { public static void main(String[] args) throws Exception { //获得 class 对象 Class c1 = Class.forName("com.reflection.User"); //1、构造一个对象,本质是无参构造器 User user1 = (User) c1.newInstance(); System.out.println(user1); //2、通过构造器创建对象 Constructor constructor = c1.getDeclaredConstructor(int.class, String.class, int.class); User user2 = (User) constructor.newInstance(1,"郭一诺",1); System.out.println(user2); //3、通过反射调用普通方法 User user3 = (User) c1.newInstance(); Method setName = c1.getDeclaredMethod("setName", String.class); //invoke 激活 setName.invoke(user3,"素小暖"); System.out.println(user3.getName()); //4、通过反射操作属性 User user4 = (User) c1.newInstance(); Field name = c1.getDeclaredField("name"); //true:取消 Java 语言访问检查 name.setAccessible(true); name.set(user4,"素小暖 2"); System.out.println(user4.getName()); } }
五、通过反射获取泛型信息
1、代码实例
package com.reflection; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import java.util.Map; public class Test04 { public void test01(Map<String,User> map, List<User> list){ System.out.println("test01"); } public Map<String,User> test02(){ System.out.println("test02"); return null; } //通过反射获取泛型信息 public static void main(String[] args) throws Exception { Method method = Test04.class.getMethod("test01", Map.class, List.class); Type[] genericParameterTypes = method.getGenericParameterTypes(); for (Type genericParameterType : genericParameterTypes) { System.out.println("***"+genericParameterType); if(genericParameterType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments(); for (Type actualTypeArgument : actualTypeArguments) { System.out.println(actualTypeArgument); } } } method = Test04.class.getMethod("test02", null); Type genericReturnType = method.getGenericReturnType(); if(genericReturnType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments(); for (Type actualTypeArgument : actualTypeArguments) { System.out.println("test02,"+actualTypeArgument); } } } }
2、控制台输出?
3、反射解决泛型问题
六、通过反射获取注解信息
1、代码实例
package com.reflection; import java.lang.annotation.*; import java.lang.reflect.Field; public class Test05 { public static void main(String[] args) throws Exception { Class c1 = Class.forName("com.reflection.Student"); //通过反射获取注解 Annotation[] annotations = c1.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); } //获得注解 value 的值 TableSu tableSu = (TableSu) c1.getAnnotation(TableSu.class); String value = tableSu.value(); System.out.println(value); //获得类指定的注解 Field field = c1.getDeclaredField("name"); FieldSu annotation = field.getAnnotation(FieldSu.class); System.out.println(annotation.columnName()); System.out.println(annotation.type()); System.out.println(annotation.length()); } } @TableSu("db_student") class Student{ @FieldSu(columnName = "db_id",type = "int",length = 10) private int id; @FieldSu(columnName = "db_name",type = "varchar2",length = 10) private String name; @FieldSu(columnName = "db_age",type = "int",length = 10) private int age; public Student() { } public Student(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public 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{" + "id=" + id + ", name='" + name + ''' + ", age=" + age + '}'; } } //类名的注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface TableSu{ String value(); } //属性的注解 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface FieldSu{ String columnName(); String type(); int length(); }
2、控制台输出?
这篇关于「Java 知识点详解 8」Java 反射机制,java 项目经验面试题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南