java反射
反射机制的作用
通过java语言中的反射机制可以操作字节码文件(可以读和修改字节码文件。)
通过反射机制可以操作代码片段。(class文件。)
获取Class的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| public class TestClass { public static void main(String[] args) { Class c1 = int.class; Student s = new Student(); Class<? extends Student> c = s.getClass(); Action a = new Action() { }; Class<? extends Action> c2 = a.getClass(); try { Class<?> c3 = Class.forName("com.redbean.reflect.testclass.Student"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
}
private static void method1(){ Class c = int.class; Class<Student> c2 = Student.class; Class<Student[]> c3 = Student[].class; Class<Action> c4 = Action.class; } }
class Student{ private int id; private String name; }
interface Action{
}
|
获取类信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| public class TestClassSelf { public static void main(String[] args) { Class c = Student.class; String name = c.getName(); String simpleName = c.getSimpleName(); System.out.println("name = " + name); System.out.println("simpleName = " + simpleName); System.out.println("package = " + c.getPackage()); System.out.println(Modifier.toString(c.getModifiers())); Class superclass = c.getSuperclass(); System.out.println("superclass = " + superclass); Class[] interfaces = c.getInterfaces(); System.out.println("interfaces = " + Arrays.toString(interfaces));
System.out.println(c.isPrimitive()); Class c2 = int.class; System.out.println(c2.isPrimitive()); Class c3 = Integer.class; System.out.println(c3.isPrimitive());
System.out.println(c.isAssignableFrom(Action.class)); System.out.println(Action.class.isAssignableFrom(c)); } }
class Student implements Action,Mark{ private String name; int age; public static int num;
public Student(){}
public Student(String name,int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String sayHello(String name){ return "hello! "+name; }
@Override public void run() {
}
@Override public void star() {
} }
interface Action{ void run(); } interface Mark{ void star(); }
|
类的信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Class c = Student.class; Field[] fields = c.getFields(); for (Field field : fields) { System.out.println("变量名:" + field.getName()); System.out.println("参数类型:" + field.getType().getName()); System.out.println("修饰符:" + Modifier.toString(field.getModifiers())); }
Field[] declaredFields = c.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println("变量名:" + declaredField.getName()); System.out.println("参数类型:" + declaredField.getType().getName()); System.out.println("修饰符:" + Modifier.toString(declaredField.getModifiers())); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Method[] methods = c.getMethods(); for (Method method : methods) { System.out.println("方法名称:" + method.getName()); System.out.println("返回类型:" + method.getReturnType().getName()); System.out.println("修饰符:" + Modifier.toString(method.getModifiers())); System.out.println("参数类型:" + Arrays.toString(method.getParameterTypes())); System.out.println("参数个数:" + method.getParameterCount()); System.out.println("异常类型:" + method.getExceptionTypes()); } Method[] declaredMethods = c.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { System.out.println("方法名称:" + declaredMethod.getName()); System.out.println("返回类型:" + declaredMethod.getReturnType().getName()); System.out.println("修饰符:" + Modifier.toString(declaredMethod.getModifiers())); System.out.println("参数类型:" + Arrays.toString(declaredMethod.getParameterTypes())); System.out.println("参数个数:" + declaredMethod.getParameterCount()); System.out.println("异常类型:" + declaredMethod.getExceptionTypes()); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Constructor[] constructors = c.getConstructors(); for (Constructor constructor : constructors) { System.out.println("名称:" + constructor.getName()); System.out.println("修饰符:" + Modifier.toString(constructor.getModifiers())); System.out.println("参数类型:" + constructor.getParameterTypes()); System.out.println("参数个数:" + constructor.getParameterCount()); } Constructor[] declaredConstructors = c.getDeclaredConstructors(); for (Constructor declaredConstructor : declaredConstructors) { System.out.println("名称:" + declaredConstructor.getName()); System.out.println("修饰符:" + Modifier.toString(declaredConstructor.getModifiers())); System.out.println("参数类型:" + declaredConstructor.getParameterTypes()); System.out.println("参数个数:" + declaredConstructor.getParameterCount()); }
|
1 2 3 4 5 6 7 8
| Annotation[] annotations = c.getAnnotations(); System.out.println(Arrays.toString(annotations)); if (c.isAnnotationPresent(Role.class)){ Role role = (Role) c.getAnnotation(Role.class); String name = role.name(); System.out.println(name); }
|