0%
简单了解Java反射的基本内容。
Java反射
Class类的使用
- A class named Class
- 1)在面向对象的世界里,万事万物皆对象。
- 类是对象,类是java.lang.Class类的实例对象
- 2)任何一个类都是Class的实例对象,这个实例对象有三种表示方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package com.rovo98.reflect;
public class ClassDemo1 { public static void main(String args[]) { Foo foo1 = new Foo() ; Class c1 = Foo.class; Class c2 = foo1.getClass() ; Class c3 = null ; c3 = Class.forName("com.rovo98.Foo"); Foo foo = (Foo)c1.newInstance() ; } } class Foo{}
|
Java动态加载类
- Class.forName(“类的名称”)
- 不仅表示了类的类类型,还代表了动态加载类
- 编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
- 使用:当有多个功能模块(具体由类实现)时,使用动态加载
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
| interface OfficeAble // 指定接口标准 { public void start() ; } class Word implements OfficeAble { public static void start() { System.out.println("Start the Word"); } } class Office { public static void main(String args[]) { try{ Class c = Class.forName(args[0]) ; OfficeAble oa = c.newInstance() ; oa.start() ; } catch (Exception e) { e.printStackTrace() ; } } }
|
通过反射获取方法信息
- getMethods() 获取所有public 方法,包括父类继承而来的
- getDeclaredMethods() 获取所有自定义的方法,不包含访问权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.rovo98.reflect;
public class ClassDemo2 { public static void main(String args[]){ Class c1 = int.class; Class c2 = String.class; Class c3 = double.class ; Class c4 = Double.class ; Class c5 = void.class ; System.out.println(c1.getName()) ; System.out.println(c3.getSimpleName()) ; } }
|
案例:
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
| package com.rovo98.feflect;
public class ClassUtil {
public static void printClassMessage(Object obj) { Class c = obj.getClass() ; System.out.println("类的名称:"+c.getName()) ;
Method[] ms = c.getMethods() ; for (int i=0; i<ms.length; i++) { Class returnType = ms[i].getReturnType() ; System.out.print(returnType.getName()+" ") ; System.out.print(ms[i].getName()+"("); for (Class class1 : paramTypes) { System.out.print(class1.getName()+","); } System.out.println(")"); } } }
|
成员变量和构造方法信息的获取
- getField()方法获取的是所有的public的成员变量的信息
- getDeclaredField()获取的是该类自己声明的成员变量的信息
- getConstructors获取所有的public的构造方法
- getDeclaredConstructors得到所有的构造方法
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 static void printClassFieldMessage(Object obj) {
Filed[] fs = c.getDeclaredFields(); for (Field field:fs) { Class fieldType = field.getType(); String typeName = fieldType.getName(); String fieldName = field.getName(); System.out.println(typeName+" "+fieldName) ; } }
public static void printConMessage(Object obj) { Class c = obj.getClass();
Construtor() cs = c.getDeclaredConstructors(); for (Constructor constructor : cs) { System.out.print(constructor.getName()+"("); Class[] paramTypes = constructor.getParameterTypes(); for (Class class1 : paramTypes) { System.out.print(class1.getName+" "); } System.out.println(")"); } }
|
java方法反射的基本操作
方法的反射
- 1)如何获取某个方法
方法的名称和方法的参数列表才能唯一决定某个方法 - 2)方法反射的操作
method.invoke(对象,参数列表)
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
| package com.rovo98.reflect;
public class MethodDemo1 { public static main(String args[]) { A a1 = new A() ; Class c = a1.getClass() ; try { Method m = c.getMethod("print",int.class,int.class); Object o = m.invoke(a1,new Object[]{10,20}); } catch (Exception e) { e.printStackTrace(); } } } class A { public vodi print(int a, int b) { System.out.println(a + b) ; } public void print(String a, String b) { System.out.println(a.toUpperCase()+","+b.tolowerCase()) ; } }
|
通过反射了解集合泛型的本质
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
| package com.rovo98.reflect;
public class MethodDemo4{ public static void main(String args[]) { ArrayList list = new ArrayList() ; ArrayList<String> list1 = new ArrayList<String>(); list1.add("hello"); Class c1 = list.getClass() ; Class c2 = list1.getClass() ; System.out.println(c1 == c2) ;
try { Method m = c1.getMethod("add",Object.class) ; Object o = c1.invoke(list1,20) ; System.out.println(list1.size()) ; }catch (Exception e) { e.printStackTrace(); } } }
|