什么是反射?
创建属性或者方法对象 然后再将属性或者方法赋予某一个类的对象
反射的操作?
1. 如何获取字节码文件对象
方式一:类名. class
Class clazz = Person . class ;
方式二:对象名. getClass ( ) ;
Class clazz = new Person ( ) . getClass ( ) ;
方式三:Class . forName ( "类的全路径名" ) ;
Class clazz = Class . forName ( "com.domain.Person" ) ;
Class 类中的方法?
public Object newInstance ( ) :创建对象
2.如何获取构造方法对象
public Constructor < T > getConstructor ( Class < ? > . . . parameterTypes)
public Constructor < ? > [ ] getConstructors ( )
public Constructor < T > getDeclaredConstructor ( Class < ? > . . . parameterTypes)
public Constructor < ? > [ ] getDeclaredConstructors ( )
Constructor 类中的方法?
public T newInstance ( Object . . . initargs)
public void setAccessible ( boolean flag)
暴力反射 :使用反射获取私有成员的时候,使用普通的对象是获取不到的,必须使用带declared的方法,而且需要设置setAccessible,值true可以获取到
3.如何获取字段(成员变量,属性)对象
public Field getField ( String name)
public Field [ ] getFields ( )
public Field getDeclaredField ( String name)
public Field [ ] getDeclaredFields ( )
Field 类中的方法?
public void set ( Object obj, Object value)
public void setAccessible ( boolean flag)
4.如何获取普通的成员方法对象
public Method getMethod ( String name, Class < ? > . . . parameterTypes)
public Method [ ] getMethods ( )
public Method getDeclaredMethod ( String name, Class < ? > . . . parameterTypes)
public Method [ ] getDeclaredMethods ( )
Method 类中的方法?
public Object invoke ( Object obj, Object . . . args)
练习?
练习一:已知有一个ArrayList,泛型为String,里面存储了一些元素,如何使用反射技术,来实现向该集合中存储Integer类型的数据?
ArrayList < String > al = new ArrayList < > ( ) ;
al. add ( "aaa" ) ;
al. add ( "bbb" ) ;
al. add ( "ccc" ) ;
Class clazz = al. getClass ( ) ;
Method addMethod = clazz. getMethod ( "add" , Object . class ) ;
addMethod. invoke ( al, 111 ) ;
addMethod. invoke ( al, 222 ) ;
addMethod. invoke ( al, 333 ) ;
addMethod. invoke ( al, true ) ;
System . out. println ( al) ;