3.3java.lang.reflect.Method类
- getModifiers:以int形式返回修饰符
[说明:默认修饰符default是0,public 是1,private是2,protected是4 , static是8,final是16]
如果有叠加的修饰符,如 public static ...,那么返回的int值就是相加的结果,public(1)+static(8)=9
- getReturnType:以Class形式获取返回值的类型的Class对象
- getName:返回方法名
- getParameteTypes:以Class[]返回参数类型数组
- getModifiers:以int形式返回修饰符
- getName:返回构造器名(全类名)
- getParameteTypes:以Class[]返回参数类型数组
例子2:使用Field类、Method类、Constructor类
package li.reflection;import org.junit.jupiter.api.Test;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;//演示如何通过反射获取类的结构信息public class ReflectionUtils {public static void main(String[] args) {}//第二组方法 API@Testpublic void api_02() throws ClassNotFoundException {//得到Class对象Class<?> personCls = Class.forName("li.reflection.Person");//getDeclaredFields:获取本类中所有属性//[说明:默认修饰符default是0,public 是1 ,private是2,protected是4 , static是8,final是16]Field[] declaredFields = personCls.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println("本类中所有属性=" + declaredField.getName()+ " 该属性的修饰符值=" + declaredField.getModifiers()+ " 该属性的类型=" + declaredField.getType());}//getDeclaredMethods:获取本类中所有方法Method[] declaredMethods = personCls.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println("本类中的所有方法=" + declaredMethod.getName()+ " 该方法的访问修饰符=" + declaredMethod.getModifiers()+ " 该方法返回类型=" + declaredMethod.getReturnType());//输出当前这个方法的形参数组情况Class<?>[] parameterTypes = declaredMethod.getParameterTypes();for (Class<?> parameterType : parameterTypes) {System.out.println("该方法的形参类型=" + parameterType);}}//getDeclaredConstructors:获取本类中所有构造器Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();for (Constructor<?> declaredConstructor : declaredConstructors) {System.out.println("=================");System.out.println("本类中所有构造器=" + declaredConstructor);Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();for (Class<?> parameterType : parameterTypes) {System.out.println("该构造器的形参类型=" + parameterType);}}}}class A {public String hobby;public void hi() {}public A() {}}interface IA {}interface IB {}@Deprecatedclass Person extends A implements IA, IB {//属性public String name;protected static int age;String job;private double sal;public Person() {}public Person(String name) {this.name = name;}//私有private Person(String name, int age) {}//方法public void m1(String name, int age, double sal) {}protected String m2() {return null;}void m3() {}private void m4() {}}

文章插图

文章插图
4.通过反射创建对象
- 方式一:调用类中的public修饰的无参构造器
- 方式二:调用类中的指定构造器
- Class类的相关方法
- newInstance:调用类中的无参构造器 , 获取对应类的对象
- getConstructor(Class...clazz):根据参数列表,获取对应的public构造器对象
- getDecalaredConstructor(Class...clazz):根据参数列表,获取对应的所有构造器对象
- Constructor类相关方法
- setAccessible:暴破
- newInstance(Object...obj):调用构造器
例子:
package li.reflection;import java.lang.reflect.Constructor;//演示通过反射机制创建实例public class ReflectCreatInstance {public static void main(String[] args) throws Exception {//1.先获取到User类的Class对象Class<?> userClass = Class.forName("li.reflection.User");//2.通过public的无参构造器创建实例Object o = userClass.newInstance();System.out.println(o);//3.通过public的有参构造器创建实例/***此时的 constructor 对象 就是*public User(String name) {//public有参构造器*this.name = name;*}*///3.1先得到对应的构造器Constructor<?> constructor = userClass.getConstructor(String.class);//3.2再去创建实例 , 并传入实参Object bob = constructor.newInstance("bob");System.out.println(bob);//4.通过非public的有参构造器创建实例//4.1得到private的构造器对象Constructor<?> declaredConstructor =userClass.getDeclaredConstructor(int.class, String.class);//4.2创建实例//暴破(暴力破解),使用反射可以访问 私有的构造器/私有的属性/私有的方法declaredConstructor.setAccessible(true);Object user2 = declaredConstructor.newInstance(99, "张三丰");System.out.println(user2);}}class User {//User类private int age = 10;private String name = "jack";public User() {//public无参构造器}public User(String name) {//public有参构造器this.name = name;}private User(int age, String name) {//private有参构造器this.age = age;this.name = name;}@Overridepublic String toString() {return "User [age=" + age + ", name=" + name + "]";}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Javascript 手写 LRU 算法
- Java 读写锁 ReadWriteLock 原理与应用场景详解
- 为什么阿里Java开发手册不推荐使用Timestamp
- 大华海康NVR录像JAVA下载及WEB播放
- Java三大框架 JAVA三大框架详细介绍
- 足底反射区疼痛是为什么
- Java找不到工作怎么办 java找不到工作怎么办
- java解析xml字符串 java怎么解析xml最简单
- java如何捕获异常 如何捕获完整的异常信息
- 什么是JavaBean 什么是java