java反射机制的基本用法

xiaoxiao2025-01-31  15

 

1、获取一个Class对象

Class c = this.getClass();//

ReflectImplement r = new ReflectImplement();//通过类实例获得

Class c1 = r.getClass();

Class subClass = c1.getSuperclass();//通过类实例获得父类对象

Class c2 = ReflectImplement.class;//通过类名.class获得

Class c3 = Class.forName("ReflectImplement");//通过类名字符串获得

 

2、获得类名称

c1.getName();

 

3、修饰符Modifier

Modifier.toString(c2.getModifiers())//类的修饰符

Field[] fields1 = c2.getDeclaredFields();//该方法访问

Modifier.toString(field1[0].getModifiers())

 

4、检索类接口

Class [] inf =  c2.getInterfaces();

 

 

5、检索类所有成员

 

Field[] fields = c2.getFields();//该方法只能访问公共变量

for(int i = 0; i < fields.length; i++)

{

String str = fields[i].getName() + "" + fields[i].getType().getName();

}

 

Field[] fields1 = c2.getDeclaredFields();//该方法访问所有变量

 

6、检索类的构造函数

 

Constructor[] constructor = c1.getDeclaredConstructors();

for(int i = 0; i < constructor.length; i++)

{

Constructor cstr = constructor[i];

System.out.print("\n" + cstr.getName());

System.out.print("\n" + cstr.getDeclaringClass());

Class[] cp = cstr.getParameterTypes();

for(int j = 0; j < cp.length; j++)

{

System.out.print("\n" + cp[j]);

}

}

 

7、检索类的方法

 

Method [] methods = c1.getDeclaredMethods();

for(int i = 0; i < methods.length; i++)

{

Method method = methods[i];

Class cp[] = method.getParameterTypes();//该方法对应的参数类型

method.getExceptionTypes();

}

 

 

 

 

-------------------------------------------高级用法案例---------------------------------------

1. 得到某个对象的属性 -

/*

   OWNER 是一个类实例 A a。

*/

public Object getProperty(Object owner, String fieldName)  {     Class<?> class1 = owner.getClass();    Field[] fields = class1.getFields();//遍历所有的属性(public)    for(int i = 0; i < fields.length; i++)    {     System.out.print(fields[i].getName());    }

   Field field = class1.getField(fieldName);//通过Class得到类声明的属性。    Object object = field.get(owner);//通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。    System.out.print(object);   }   return null;    }

 

 

 

得到类的静态属性

   public Object getStaticProperty(Object owner, String fieldName)  {     Class<?> class1 = owner.getClass();    Field field = class1.getField(fieldName);//该属性是静态的,所以直接从类的Class里取    Object object = field.get(class1);   return null;    }

 

 //执行某对象的方法

  public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception  {   Class<?> ownerClass = owner.getClass();   Class<?>[] argsClass = new Class[args.length];   for(int i = 0, j = args.length; i < j; i++)   {    argsClass[i] = args[i].getClass();   }   Method method = ownerClass.getMethod(methodName, argsClass);//查找匹配的方法   return method.invoke(owner, args);

  return method.invoke(null, args);//如果是静态方法,则用NULL,因不需要借助实例对象  }

 

 

 

 //新建实例对象

Class newoneClass  =  Class.forName(className);

  Class[] argsClass  =   new  Class[args.length];

for  ( int  i  =   0 , j  =  args.length; i  <  j; i ++ ) {

argsClass[i]  =  args[i].getClass();

}

Constructor cons  =  newoneClass.getConstructor(argsClass);return  cons.newInstance(args); //新建实例。

 如果不需要参数,可以直接使用newoneClass.newInstance()来实现。

 

 

 

转载请注明原文地址: https://www.6miu.com/read-5023607.html

最新回复(0)