java反射机制

反射就是把java中的各种成分映射成一个个的java对象

1. Class对象:class类的实例表示正在运行的java应用程序中的类和接口。所有具有相同元素类型和维数的数组都共享改Class对象

获取Class对象有三种方式

(1) 通过实例变量的getClass()方法

Class cl=new String(“abc”).getClass();

(2) 通过Class类的静态方法--forName()来实现

Class class=Class.forName(className);

(3) 使用类字面常量或TYPE字段

① Class MyObjectClass=MyObject.class;

② Class c=Integer.TYPE;

2. 类,通过反射可以从中获取 类名、类修饰符、包信息、父类、实现的接口、构造函数、方法、字段、注解

(1) 类名

① 可以使用getName()getCanonicalName()获取包含包名的类名

Class stuClass=MyObject.class;

//String stuName=stuClass.getName();

 

String stuName=stuClass.getCanonical();

② 可以使用getSimpleName()获取不包含包名的类名

Class stuClass=MyObject.class;

String simpleClassName=stuClass.getSimpleName();

(2) 修饰符 可以使用getModifiers()来获取一个类的修饰符

Class modiClass=MyObject.class;

Int modifiers=modiClass.getModifiers();

//检验修饰符

Modifier.isAbstract/isFinal(int modifiers);

Modifier.isInterface/isProtected/isPublic(int modifiers);

Modifier.isStatic/isSynchronized(int modifiers);

(3) 包信息 使用Class对象获取包信息

Class pClass=MyObject.clss;

Package package=pClass.getPack();

String packageName=package.getName();

(4) 父类 通过Class对象可以获取类的父类

Class objClass=MyObject.class;

Class superclass=objClass.getSuperclass();

(5) 实现接口

Class interClass=MyObject.class;

Class[] interfaces=interClass.getInterfaces();//一个类可以实现多个接口

(6) 构造函数

Class consClass=MyObject.class;

Constructor[] constructors=consClass.getConstructors();

(7) 方法

Class aClass=MyObject.class;

Method[] method=aClass.getMethods();

(8) 字段可以通过Class对象获取类的字段(成员变量)

Class aClass=MyObject.class;

Field[] fields=aClass.getFields();

(9) 注解

Class aClass=MyObject.class;

Annotation[] annotations=aClass.getAnnotations();

3. 构造函数 通过java反射可以在运行时检查类的构造函数并实例化对象

(1) 获取Constructor对象 通过从Class对象获取的

Class aClass=MyObject.class;

Constructor[] constructors=aClass.getConstructors();

(2) 构造函数参数

Class aClass=MyObject.class;//MyObject有一个参数为字符串的公共构造函数

Constructor constructor=aClass.getConstructor(new Class[]{String.class});

Class[] parameterTypes=constructor.getParameterType();

(3) 使用Constructor对象实例化对象

//获取使用字符串作为参数的constructor

Constructor constructor=MyObject.class.getConstructor(String.class);

MyObject myObject=(MyObject)constructor.newInstance(“constr”);

4. 字段 通过java反射可以在运行时检查类的字段并提供get/set,通过java.lang.reflect.Field来完成

(1) 可以获取Field对象

Class aClass=MyObject.class;

Field[] methods=aClass.getFields();

(2) 字段名称 通过Field.getName()方法来获取字段名称

Field field=new Field();//获取field对象

String fieldName=field.getName();

(3) 字段类型

Field field=aClass.getField(“someField”);

Object fieldType=field.getType();

(4) 获取和设置字段值

Class aClass=MyObject.class;

Field field=aClass.getField(“someField”);

MyObject objectInstance=new MyObject();

Object value=field.get(objectInstance);

Field.set(objectInstance,value);  

5. 方法 使用java反射在运行时检查类的方法并调用他们

(1) 获取Method对象

Class class1=MyObject.class;

Method methods=class1.getMethods();

(2) 方法的参数和返回值类型

Method method=class1.getMethods();

Class returnType=method.getReturnType();

(3) 使用Method对象调用方法

Method method=MyObject.class.getMethod(“doSomething”,String.class);

Object returnValue=method.invoke(null,”parameterValue”);

6. Getset方法

7. 私有字段和方法

(1) 访问私有字段通过class.getDeclaredField(Stringname)class.getDeclaredFields()

(2) 访问私有方法 通过class.getDeclaredMethod(String name,Class[] parameterTypes)class.getDeclaredMethod()

8. Array

(1) Java.lang.reflect.Array 通过java反射使用数组完成

(2) 创建数组

Int[] array=(int[])Array.newInstance(int.class,3);

(3) 访问数组 通过Array.get()Array.set()

Int[] array=(int[])Array.newInstance(int.class,3);

Array.set(array,0,123);

Array.set(array,1,456);

System.out.println(“array[0]=”+Array.get(array,0));

System.out.println(“array[1]=”+Array.get(array,1));

(4) 获取数组的class对象

(5) 获取数组的组件类型 通过class.getComponentType()来获取其它组件类型

String[] stings=new String[3];

Class stringArrayClass=strings.getClass();

Class stringArrayComponentType=stringArrayClass.getComponentType();

System.out.println(stringArrayComponentType);

9. 注解 使用java反射机制可以在运行时访问java类中的注解

(1) 类注解

Class aClass=TheClass.class;

Annotation[] annotations=aClass.getAnnotations();

For(Annotation annotation:annotations){

If(annotation instanceof MyAnnotation){

MyAnnotation myAnnotation=(MyAnnotation) annotation;

System.out.println(“name:”+myAnnotation.name());

System.out.println(“value:”+myAnnotation.value());

}

}

(2) 方法注解

Public class TheClass{

@MyAnnotation(name=”someName”,value=”HelloWorld”)

Public void doSomething(){}

}

(3) 参数注解

Public class TheClass{

Public static void doSomethingElse(

@MyAnnotation(name=“aName”,value=”aValue”) String parameter

){}

}

(4) 字段注解

Public class TheClass{

@MyAnnotation(name=”someName”,value=”Hello World”)

Public String myField=null;

}

10. 泛型

(1) 泛型方法的返回值类型

Protected List<String> stringList=new ArrayList<String>();

Public List<String> getStringList(){

Return this.stringList;

}

(2) 泛型方法的参数类型

Protected List<String> stringList=new ArrayList<String>();

Public void setStringList(List<String> list){

This.stringList=list;

}

(3) 泛型字段类型

Public class MyClass{

Public List<String> stringList=new ArrayList<String>();

}

Field field=MyClass.class.getField(“stringList”);

Type genericFieldType=field.getGenericType();

If(genericFieldType instanceof ParameterizedType){

ParameterizedType aType=(ParameterizedType) genericFieldType;

Type[] fieldArgTypes=aType.getActualTypeArguments();

For(Type fieldArgType: fieldArgTypes){

Class fieldArgClass=(Class)fieldArgType;

System.out.println(“fieldArgClass=”+fieldArgClass);

}

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值