反射

反射

java.lang.Class
在类加载时,java虚拟机会自动创建相应的class对象
1.获取class对象
Class c=Class.froName("c");
2.解析属性信息
Field[] fs=c.getDeclaredFields();
for(Field f:fs){
   System.out.println("属性:"+f.toString());
   System.out.println("数据类型:"+f.getType());
   System.out.println("属性名:"+f.getName());
   int mod=f.getModifeers();
   System.out.println("属性修饰符:"+Modifier.toString(mod));
}
3.解析方法信息
Method[] ms=c.getDeclaredMethods();
for(Method m:ms){
   System.out.println("方法:"+m.toString());
   System.out.println("方法名:"+m.getName());
   int mod=f.getModifeers();
   System.out.println("方法修饰符:"+Modifier.toString(mod));
   Class pts[] = m.getParameterTypes();//得到参数列表
   m.getReturnType();//得到返回值类型
}
4.解析构造方法
Constructor[]  cs=c.getDeclaredConstructors();
for(Constructor con:cs){
   System.out.println("构造方法:"+con.toString());
   System.out.println("方法名:"+con.getName());
   System.out.println("方法修饰符:"+Modifier.toString(mod));
   Class pts[] = m.getParameterTypes();//得到参数列表
   m.getReturnType();//得到返回值类型
}
5.解析当前类类型的父类
Class superClass=c.getSuperclass();
6.解析当前类实现的接口
Class[] interfaces=c.getInterfaces();
for(Class cl:interfaces){
   System.out.println(cl.toString());
}
7.解析当前包
Package p=c.getPackage();
---------------------------------------------------------------

1.直接操作对象属性
User u=new User();
Class c=u.getClass();//同Class.forName("p2.User");
Field f=c.getField(fieldName);
Object fv=f.get(u);//得到对象u实例对应f属性的值
f.set(u,value);设置u对象f属性的值为value
2.调用对象成员方法
Class[] argTypes={String.class,int.class};
//上行等同Class[] argTypes=new Class[]{String.class,int.class};
Object[] args=new Object[]{"王五",99};

Class c-u.getClass();
Method m=c.getMethod(methodName,argTypes);
Object result=m.invoke(u,args);
System.out.println(result);
3.调用类成员方法
Class c=Class.forName("className");
Method m=c.getMethod(methodName,argTypes);
Object result=m.invoke(null,args);//没有对象,所以指定为null
---------------------------------------------------------------
获取class对象
*针对引用数据类型
1.调用静态方法Class.forName()
Class.forName("p1.User");
2.调用Object类中定义的getClass()方法
User u=new User();
Class c=u.getClass();
3.使用.class表达式
Class c1=String.class;
Class c2=p1.User.class;
*针对基本数据类型及void
1.使用.class表达式
Class c1=int.class;
Class c2=double.class;
Class c3=void.class;
2.调用相应封装类的.Type属性
Class c1=Integer.TYPE;
Class c2=Double.TYPE;
Class c3=Void.TYPE;
----------------------------------------------
java.lang.reflect.Field
1.获取Field对类(Class类提供)
public Field[] getDeclaredFields()//当前类的所有属性,不包括父类
public Field getDeclaredField(String name)//当前类指定属性,不包括父类
public Field[] getFields()//当前类所有public的属性,包括父类
public Field getField(String name)//当前类指定的public属性,包括父类
2.Field类主要成员方法
public Object get(Object obj)
pbulic void set(Object obj,Object value)
public xxx getXxx(Object obj)
public void setXxx(Object obj,xxx x)//xxx为基本数据类型
public String getName()
public int getModifiers()//当前属性的修饰符
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
返回当前属性前面的注释
public String toString()
public boolean equals(Object obj)
------------------------------------------------------------------------
java.lang.reflect.Method
1.获取Method对类(Class类提供)
public Method[] getDeclaredMethods()//当前类的所有方法,不包括父类
public Method getDeclaredMethod(String name,Class<?> parameterTypes)//当前类指定方法,不包括父类
public Method[] getMethods()//当前类所有public的方法,包括父类
public Method getMethod(String name)//当前类指定的public方法,包括父类
2.Method类主要成员方法
public Object invoke(Object obj,Object args)****
public String getName()
public Class<?>[] getParameterTypes()
public int getModifiers()//当前属性的修饰符
public Class<?> getReturnType()
public Class<?>[] getExceptionTypes()
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
返回当前属性前面的注释
public String toString()
public boolean equals(Object obj)
-----------------------------------------------------------
java.lang.reflect.Modifier
1.获取Modifier对象
public int getModifieers()
2.Modifier类方法
public static boolean isPublic(int mod)
public static boolean isPrivate(int mod)

--------------------------------------------------------------
java.lang.reflect.Constructor
public T newInstance(Object initargs)

Class c=Class.forName("p1.Person");
Class[] argTypes={String.class,int.class};//参数列表
Constructor cons=c.getConstructor(argTypes);
Object obj=cons.newInstance("中国",5000);

调用无参构造方法
cons=c.getconstructor();
obj=constructor.newInstance();
obj=c.newInstance();
----------------------------------------------------------------
java.lang.reflect.Array

class类方法
public Class<?> getComponentType()//返回数组对象的数据类型

你可能感兴趣的:(反射)