java反射-学习
使用Java反射机制可以在运行时期获取Java类的信息,可获取以下相关的内容:
Class对象
类名
修饰符
包信息
父类
实现的接口
构造器
方法
变量
注解
简单的反射例子:
1、获取class对象(前提):
Class<Test> testClass = Test.class; 或 Class<?> aClass = Class.forName("com.alibaba.fastjson.JSONObject");
2、获取类名:
String name1 = testClass.getName(); System.out.println("类名:"+name1);
结果:
类名:com.example.demo.Test
3、修饰符
Class<Test> testClass = Test.class; //当前类的修饰符 int modifiers = testClass.getModifiers(); System.out.println(Modifier.isAbstract(modifiers)); System.out.println(Modifier.isPublic(modifiers)); System.out.println(Modifier.isPrivate(modifiers)); //结果 false true false
方法的修饰符
Class<Test> testClass = Test.class; Method method = testClass.getMethod("getName", new Class[]{}); int modifiers1 = method.getModifiers(); System.out.println(Modifier.isPrivate(modifiers1)); System.out.println(Modifier.isPublic(modifiers1)); //结果 false true
4、包信息
Class<Test> testClass = Test.class; Package aPackage = testClass.getPackage(); System.out.println(aPackage); //结果 package com.example.demo
5、父类
Class<Test> testClass = Test.class; Class<? super Test> superclass = testClass.getSuperclass(); String name = superclass.getName(); System.out.println(name); //结果 java.lang.Object
6、实现的接口
Class<Test> testClass = Test.class; Class<?>[] interfaces = testClass.getInterfaces(); for (Class<?> anInterface : interfaces) { System.out.println(anInterface.getName()); } //test类没有实现接口 ,interfaces为空数组
7、构造器(获取public共有修饰符的构造方法)
Class<Test> testClass = Test.class; Constructor<?>[] constructors = testClass.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor.getName()); } //结果 com.example.demo.Test
例子:
Class<Test> testClass = Test.class; Constructor<Test> constructor = testClass.getConstructor(); Test test = constructor.newInstance(); System.out.println(test.delete()); //结果 delete
8、获取变量和方法
package com.example.demo; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { public static void main(String[] args) { //获取属性 Field[] fields = Test.class.getDeclaredFields(); for (Field field : fields) { System.out.println(field.getName()); } System.out.println("属性==================方法"); Method[] methods = Test.class.getMethods(); for (Method method : methods) { String name = method.getName(); System.out.println(name); } } private String name; private String sex; public String delete() { return "delete"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
输出结果:
name sex 前边为属性==================后边为当前类的所有的方法方法(保存从父类那继承来的方法) main getName delete setName getSex setSex wait wait wait equals toString hashCode getClass notify notifyAll
例子:
Class<Test> testClass = Test.class; //获取的方法是没有参数的,所以下边这个第二个参数就可以设置为null Method getName = testClass.getMethod("getName", null); //set方法只有一个参数,下班这个方法的第二个参数就是string.class Method setName = testClass.getMethod("setName", String.class); //假如一个方法有两个参数,则需要如下设置第二个参数 Method setSex = testClass.getMethod("setSex", new Class[]{String.class, String.class});
获取一个方法的参数类型:
Class<Test> testClass = Test.class; Method method = testClass.getMethod("getName", null); Class<?>[] parameterTypes = method.getParameterTypes(); for (Class<?> parameterType : parameterTypes) { System.out.println(parameterType.getName()); }
后去一个方法的返回类型:
Class<Test> testClass = Test.class; Method method = testClass.getMethod("getName", null); Class<?> returnType = method.getReturnType(); System.out.println(returnType.getName()); //结果 getname方法的返回值的类型为string java.lang.String
通过method调用方法:如果执行的是静态方法,的method.invoke方法的第一个参数可以设置为null,第二个参数为方法执行需要的实参
Test t = new Test(); t.setName("aaaaa"); Class<? extends Test> testClass = t.getClass(); Method method = testClass.getMethod("getName",null); String invoke = (String)method.invoke(t,null); System.out.println(invoke);
****Method.setAcessible(true)这行代码,通过调用setAccessible()方法会关闭指定类的Method实例的反射访问检查
9、注解
Class<Test> testClass = Test.class; Annotation[] annotations = testClass.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); }