【Java-Reflection】Class以及反射成员变量和方法

来源:互联网 发布:mysql strcmp 编辑:程序博客网 时间:2024/04/30 15:29

一、获取Class对象

获取Class对象有两种方法:1. ClassName.class    2. Class.forName(className);  className是全名,包括包名。
package com.yjb.example;public class ReflectionDemo {public static void main(String[] args){        <span style="white-space:pre"></span>//Class myClass = MyObject.class;//或者通过类的全名获取classClass mainClass = Class.forName("com.yjb.example.ReflectionDemo");//get inner classClass innerClass = Class.forName("com.yjb.example.MyObject");        }}<p class="p1"><pre name="code" class="java">class MyObject{public int publicint =0;private int privateint =0;public MyObject(){}public MyObject(int i){privateint = i;System.out.println("con-->"+i);}public int publicMethod(){return 0;}public String publicMethod(String s){return s;}private String privateMethod(){return "this is private method";}}


<span style="white-space:pre"></span>//获取Class名字(不包含包名)<span style="white-space:pre"></span>System.out.println("SimpleName:"+innerClass.getSimpleName());<span style="white-space:pre"></span>//获取Class全名(包括包名)<span style="white-space:pre"></span>System.out.println("Name:"+innerClass.getName());<span style="white-space:pre"></span>//获取Class的修饰符,返回的是一个int类型,可以通过isXXXX判断内容<span style="white-space:pre"></span>int modifier = mainClass.getModifiers();<span style="white-space:pre"></span>System.out.println(modifier);<span style="white-space:pre"></span>System.out.println(Modifier.isPublic(modifier));

二、获取构造器

//获取指定参数的构造器,设置指定参数用 new Class[]{String.class,int.class.....}后面也会用到Constructor  con = innerClass.getConstructor(new Class[]{int.class});//获取所有的构造器Constructor[]cons = innerClass.getConstructors();for(Constructor c:cons){//获取每个构造器的参数System.out.println(c.getParameterTypes());}//通过构造器实例化对象,注意得转型MyObject myObject = (MyObject)con.newInstance(1);

三、获取变量field

//获取所有的public成员变量Field[] fields = innerClass.getFields();for(Field f:fields){//获取变量的名字System.out.println(f.getName());}//获取指定名字的成员变量(也必须是public)Field field = innerClass.getField("publicint");MyObject myObject2 = new MyObject();myObject2.publicint=1;//通过get()获取指定对象实例的成员变量数值System.out.println(field.get(myObject2));//通过set()设置对象的变量field.set(myObject2, 2);//再次读取,已被修改System.out.println(field.get(myObject2));

四、获取方法method

//get all methods include privateMethod[] methods = innerClass.getDeclaredMethods();//get all public methodsMethod[] ms = innerClass.getMethods();//get method by name and paramsMethod m1 = innerClass.getMethod("publicMethod", new Class[]{String.class});System.out.println(m1);Method m2 = innerClass.getMethod("publicMethod", null);System.out.println(m2);//获取method的参数Class[] paramsTypes = m1.getParameterTypes();for(Class c : paramsTypes)System.out.println(c);//获取method的返回类型Class returnTypes = m2.getReturnType();System.out.println(returnTypes);//run the methodObject returnValue = m1.invoke(myObject, "this is my invoke");System.out.println(returnValue);

五、private field和method

<pre name="code" class="java"><span style="white-space:pre"></span>/*
<span style="white-space:pre"></span>*注:所有的getMethod getField 都只能获取public,想获取private得用getDeclaredField和getDeclaredMethod
*在调用field.get以及method.invoke之前,要setAccessible(true)*/
//reflect private filedMyObject myObject3 = new MyObject(99);Field myPrivateField = myObject3.getClass().getDeclaredField("privateint");//set accessablemyPrivateField.setAccessible(true);System.out.println("private_field:"+myPrivateField.get(myObject3));//reflect private methodMethod PrivateMethod = MyObject.class.getDeclaredMethod("privateMethod", null);PrivateMethod.setAccessible(true);System.out.println(PrivateMethod.invoke(new MyObject(), null));






0 0