Java反射详解
来源:互联网 发布:tensorflow tutorial 编辑:程序博客网 时间:2024/06/06 11:38
Class类的使用
- Foo这个类也是实例对象,是Class类的实例对象,如何表示见下方
- 任何一个类都是Class的实例对象,这个实例对象有三种表现方式
public static void main(String[] args){ //第一种表示方式,任何一个类都有一个隐含的静态成员变量class Class c1 = Foo.class; //第二种表达方式,已经知道该类的对象通过getClass方法 Foo foo1 = new Foo(); Class c2 = foo1.getClass(); //第三种表达方式 Class c3 = null; try{ c3 = Class.forName("com.test.model.Foo"); }catch(ClassNotFoundException e){ e.printStackTrace(); }}
通过Class的实例创建Foo实例
newInstance()创建对象记得强制转换成该对象,强制转换的类要有无参构造方法
try{ Foo foo= (Foo)c1.newInstance();}catch(Exception e){ e.printStackTrace();}
动态加载类
Class.forName(“类的全称”)
- 不仅表示类的类类型,还代表了动态加载类
- 编译时候加载类是静态加载类,运行时刻加载类是动态加载类
获取方法信息
获取返回值类型、方法名、参数类型
public static void getClassMethod(Object obj){ Class c = obj.getClass(); //获取类的名称 System.out.println("类名为:"+c.getName()); /* *Method类,方法对象 *一个成员方法,就是一个method对象 *getMethods()获取的是所有public的函数,包括父类继承而来 *getDeclaredMethods()获取的是所有该类自己的方法,不论访问权限*/ Method[] ms = c.getMethods(); for(int i=0;i<ms.length;i++){ //得到方法的返回值 Class returnType = ms[i].getReturnType(); //得到返回值.class System.out.print(returnType.getName()+" "); //得到返回值类型的名称 //得到方法的名称 System.out.print(ms[i].getName()+"("); //获取参数类型,得到的是参数的类类型 Class[] paramTypes = ms[i].getParameterTypes(); for(Class class1 : paramTypes){ System.out.print(class1.getName()+","); } System.out.println(")"); }}
成员变量
//获取成员变量的信息public static void getField(Object obj){ Class c = obj.getClass(); /* *成员变量也是对象,java.lang.reflect.Field *Field类封装了关于成员变量的操作 *getFields()获取的是所有public的成员变量 *getDeclaredFields()获取的是所有该类自己声明的成员变量 */ Field[] 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 getConMessage(Object obj){ Class c = obj.getClass(); /* *构造函数也是对象,java.lang.Constructor封装了构造函数的信息 *getConstructors()获取所有public的构造函数 *getDeclaredConstructors()获取所有的构造函数 */ Constructors[] cs = c.getDeclaredConstructors(); for(Constructor con : cs){ System.out.print(con.getName()+"("); //获取构造函数的参数列表 Class[] paramTypes = con.getParameterTypes(); for(Class class1 : paramTypes){ System.out.print(class1.getName()+","); } System.out.println(")"); }}
方法反射的基本操作
public class MethodDemo1 { public static void main(String[] args) { //要获取print(int ,int )方法 1.要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型 A a1 = new A(); Class c = a1.getClass(); /* * 2.获取方法 名称和参数列表来决定 * getMethod获取的是public的方法 * getDelcaredMethod自己声明的方法 */ try { //Method m = c.getMethod("print", new Class[]{int.class,int.class}); Method m = c.getMethod("print", int.class,int.class); //方法的反射操作 //a1.print(10, 20);方法的反射操作是用m对象来进行方法调用 和a1.print调用的效果完全相同 //方法如果没有返回值返回null,有返回值返回具体的返回值 //Object o = m.invoke(a1,new Object[]{10,20}); Object o = m.invoke(a1, 10,20); System.out.println("=================="); //获取方法print(String,String) Method m1 = c.getMethod("print",String.class,String.class); //用方法进行反射操作 //a1.print("hello", "WORLD"); o = m1.invoke(a1, "hello","WORLD"); System.out.println("==================="); //获取方法print() //Method m2 = c.getMethod("print", new Class[]{}); Method m2 = c.getMethod("print"); // m2.invoke(a1, new Object[]{}); m2.invoke(a1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}class A{ public void print(){ System.out.println("helloworld"); } public void 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 0
- java反射机制详解!
- java 反射机制详解
- JAVA反射详解
- JAVA反射机制详解
- java反射机制详解
- java反射详解
- Java反射机制详解
- Java反射机制详解
- java反射机制详解
- java反射详解
- Java反射机制详解
- java反射详解
- Java反射机制详解
- JAVA反射详解
- java反射详解
- java反射详解
- java反射详解
- java反射详解
- Linux下进程描述(1)—进程控制块
- PHP socket服务器框架Workerman (GatewayWorker)
- 摄像机摇移跟随
- Redis安装
- 小强ROS机器人教程(17)___利用ORB_SLAM2建立环境三维模型
- Java反射详解
- C++中的继承(3)作用域与重定义,赋值兼容规则
- tensorflow函数--softmax_cross_entropy_with_logits
- BZOJ 1179: [Apio2009]Atm
- (c语言)结构体方法,计算该日是当年的第几天
- 建立HashSet的实例,依次填入三个名字判断实例中是否存在"Kobe"
- C++中的类继承(1) 三种继承方式
- Windows 10 很快变得更安全
- win10 uwp 拖动控件