java反射中常用的API

本文介绍Java反射API的基本使用方法,包括如何获取Class对象的不同方式及Class类提供的主要功能,如获取包名、类修饰符等。

下面提供了java反射中常用的一些API函数的使用。

       首先看看Class,反射的核心类,所有的操作都是围绕该类来生成的,Class类十分的特殊,和其他的类一样继承与Object类,其实例用来表达 java在运行时的classes和interface ,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键字void。当一個class被加载,或当类加载器(class loader)的defineClass()被JVM 调用,JVM 便自动的产生一個Class object实例。

获得Class的途径可以有以下几种:
   
------1. 运用getClass()
注:每个class 都有此函数
String str = "abc";
Class c1 = str.getClass();

------2.运用etSuperclass()
Class.getSuperclass();
Button b = new Button();
Class c1 = b.getClass();
Class c2 = c1.getSuperclass();

-----3. 运用static 方法 Class.forName()

Class c1 = Class.forName ("java.lang.String");
Class c2 = Class.forName ("java.awt.Button");
Class c3 = Class.forName ("java.util.LinkedList$Entry");
Class c4 = Class.forName ("I");
Class c5 = Class.forName ("[I");

------4. 运用  .class 語法

Class c1 = String.class;
Class c2 = java.awt.Button.class;
Class c3 = Main.InnerClass.class;
Class c4 = int.class;
Class c5 = int[].class;

-----运用 primitive wrapper classes 的TYPE 语法

Class c1 = Boolean.TYPE;
Class c2 = Byte.TYPE;
Class c3 = Character.TYPE;
Class c4 = Short.TYPE;
Class c5 = Integer.TYPE;
Class c6 = Long.TYPE;
Class c7 = Float.TYPE;
Class c8 = Double.TYPE;
Class c9 = Void.TYPE;

Java Reflection中常用的函数使用方法如下:
java 代码


   1.  package cn.com.reflection; 
   2.  
   3. import java.lang.reflect.Modifier; 
   4.  
   5. public class ReflectTester2 { 
   6.  
   7.     /**
   8.      * @param args
   9.      */ 
  10.     public static void main(String[] args) { 
  11.          
  12.         String str="hejianjie"; 
  13.         Class cls=str.getClass(); 
  14.          
  15.         //获取该对象所属于的包 
  16.         Package pack=cls.getPackage(); 
  17.         String packName=pack.getName(); 
  18.         System.out.println("包名:"+packName); 
  19.          
  20.         //获取对象所属类的修饰符 
  21.         int flag=cls.getModifiers(); 
  22.         String modiferName=Modifier.toString(flag); 
  23.         System.out.println("类修饰符:"+modiferName); 
  24.         //判断是否接口 
  25.         boolean bool=Modifier.isInterface(flag); 
  26.         System.out.println("该Class是接口乎:"+bool); 
  27.          
  28.         //返回类的名字 
  29.         String classname=cls.getName(); 
  30.         System.out.println("该Class所代表对象的完整的包名是:"+classname); 
  31.          
  32.         //返回父类的Class的名字 
  33.         Class supClass=cls.getSuperclass(); 
  34.         String supClassName=supClass.getName(); 
  35.         System.out.println("父类的Class的名称:"+supClassName); 
  36.  
  37.         //返回该Class所代表的对象实现的接口的Class的数组 
  38.         Class[] iterClass=cls.getInterfaces(); 
  39.         for(int i=0;i
  40.             Class classType=iterClass[i]; 
  41.             System.out.println(classname+"类所实现的接口:"+classType); 
  42.         } 
  43.          
  44.          
  45.     } 
  46.  
  47. } 



程序运行结果如下:
java 代码


   1. 包名:java.lang 
   2. 类修饰符:public final 
   3. 该Class是接口乎:false 
   4. 该Class所代表对象的完整的包名是:java.lang.String 
   5. 父类的Class的名称:java.lang.Object 
   6. java.lang.String类所实现的接口:interface java.io.Serializable 
   7. java.lang.String类所实现的接口:interface java.lang.Comparable 
   8. java.lang.String类所实现的接口:interface java.lang.CharSequence

<think>好的,用户想了解Java反射相关的常用API示例。首先,我需要回忆反射的核心类和它们的方法。反射主要涉及Class类,以及java.lang.reflect包中的Field、Method、Constructor等。 用户可能知道反射的基本概念,但需要具体的使用示例。我应该从如何获取Class对象开始,比如通过Class.forName()、对象.getClass()或者类名.class。接着,需要展示如何获取字段、方法和构造函数,并演示如何访问和操作它们,比如获取私有字段的值或调用私有方法。 还要注意用户提到的引用资料,引用[1]提到了获取类的字段和方法,引用[3]提到了反射API的结构。需要结合这些内容,给出具体的代码示例,并确保每个步骤都有说明。比如,Field的get()和set()方法,Method的invoke(),以及设置访问权限的setAccessible()。 另外,用户可能需要了解实际应用场景,比如动态代理或框架中的使用,如Spring,但问题主要聚焦在API示例上,所以重点放在代码演示。同时,要提醒反射的使用注意事项,比如性能影响和安全性。 最后,生成相关问题时要围绕反射的深入应用、优缺点、动态代理等,参考引用中的内容。确保回答结构清晰,步骤明确,代码正确,符合用户的中文要求。</think>### Java反射常用API及示例 Java反射API允许程序在运行时获取类的信息并动态操作对象。以下是核心API的使用示例: --- #### 1. **获取Class对象** ```java // 方式1:通过类名.class Class<?> clazz1 = String.class; // 方式2:通过对象.getClass() String str = "test"; Class<?> clazz2 = str.getClass(); // 方式3:通过Class.forName() Class<?> clazz3 = Class.forName("java.lang.String"); ``` --- #### 2. **获取字段信息** ```java Class<?> clazz = User.class; // 获取所有公共字段 Field[] publicFields = clazz.getFields(); // 获取所有字段(包括私有) Field[] allFields = clazz.getDeclaredFields(); // 获取特定字段并操作值 try { Field nameField = clazz.getDeclaredField("name"); nameField.setAccessible(true); // 允许访问私有字段 User user = new User(); nameField.set(user, "Alice"); // 设置字段值 Object value = nameField.get(user); // 获取字段值 } catch (Exception e) { e.printStackTrace(); } ``` --- #### 3. **获取方法信息** ```java Class<?> clazz = User.class; // 获取所有公共方法(包括继承的) Method[] publicMethods = clazz.getMethods(); // 获取所有声明的方法(包括私有) Method[] allMethods = clazz.getDeclaredMethods(); // 调用方法示例 try { Method method = clazz.getDeclaredMethod("setName", String.class); method.setAccessible(true); // 允许调用私有方法 User user = new User(); method.invoke(user, "Bob"); // 调用方法 } catch (Exception e) { e.printStackTrace(); } ``` --- #### 4. **操作构造函数** ```java Class<?> clazz = User.class; // 获取所有公共构造函数 Constructor<?>[] publicConstructors = clazz.getConstructors(); // 获取所有构造函数(包括私有) Constructor<?>[] allConstructors = clazz.getDeclaredConstructors(); // 创建对象实例 try { Constructor<?> constructor = clazz.getDeclaredConstructor(String.class); constructor.setAccessible(true); // 允许访问私有构造方法 User user = (User) constructor.newInstance("Charlie"); } catch (Exception e) { e.printStackTrace(); } ``` --- #### 5. **其他常用API** - **获取父类**:`clazz.getSuperclass()` - **获取接口**:`clazz.getInterfaces()` - **判断类型**:`clazz.isInterface()`, `clazz.isArray()` --- ### 反射的典型应用场景 1. **框架开发**:如Spring通过反射创建Bean实例并注入依赖[^2]。 2. **动态代理**:结合`java.lang.reflect.Proxy`实现接口的代理类。 3. **序列化工具**:JSON库(如Jackson)利用反射解析对象字段。 --- ### 注意事项 1. **性能问题**:反射操作比直接调用慢,频繁使用需谨慎。 2. **安全限制**:私有字段/方法需调用`setAccessible(true)`,可能触发安全管理器拦截[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值