反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
1.JDBC中,利用反射动态加载了数据库驱动程序
2.Web服务器中利用反射调用了Servlet的服务方法
3.很多框架都用到了反射机制(例如Spring)注入属性,调用方法
1.动态代理是运行时动态生成代理类
2.动态代理的应用有SpringAOP 数据查询,Java注解对象获取等
3.如何实现动态代理:JDK原生动态代理和 cglib 动态代理。JDK原生动态代理是基于接口实现的,而cglib是基于继承当前类的子类实现的
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时获取任意一个类所具有的成员变量和方法
4.在运行时调用任意一个对象的方法
//获得在 c 类中直接定义的所有字段
Field[] fields = c.getDeclaredFields();
//获得在 c 类及其 继承的 public字段中 获的所有字段
Field[] fields = c.getFields();
// 根据字段名称从本类直接声明的字段中获得指定字段
Field f = c.getDeclaredField( "name" ); // NoSuchFieldException
// 从本类及其继承的 public 字段中获得指定名称的字段
Field f = c.getField( "name" );
// 获得在 c 类中直接定义的所有方法
Method[] methods = c.getDeclaredMethods();
// 获得 c 类中所有的公开方法和从父类中继承的公开方法
Method[] methods = c.getMethods();
// 从 c 类的公开方法及其父类的公开方法中获取指定方法
Method m = c.getMethod( "add" , int.class , int.class );
// 在 c 类中寻找指定的方法( 根据名称和参数来确定 )
m = c.getDeclaredMethod( "first" , String.class );
// 直接获取在 Beast 类中定义的内部类或内部接口
Class<?>[] classes = Beast.class.getDeclaredClasses();
// 获取 Beast 类中 公开的 内部类或接口 , 或者获得其父类中 公开的 内部类或接口
classes = Beast.class.getClasses();
// 获得本类定义的所有构造方法(不考虑访问修饰符的影响)
Constructor<?>[] constructors = c.getDeclaredConstructors();
// 仅获得本类中 public 修饰的构造方法
Constructor<?>[] constructors = c.getConstructors();
//通过 创建实例为 字段赋值
//1.获取相应的类
Loong x = new Loong()
Class<?> c = x.getClass();
//2.获取相应的字段
Field f = c.getDeclaredField( "name" );
//3.判断所获取的字段是否为私有
if( !Modifier.isPublic( f.getModifiers() ) ) {
f.setAccessible(true);
}
//4.赋值( 将 "敖广" 赋值给 x 对象的 f 字段)
f.set(x,"敖广")//x.name = "敖广"
//5.获取 x 对象的 f 字段
f.get(f)//Object v = v.name
//通过获取静态方法为 字段赋值
//1.获取相应的字段(school为静态方法)
Field f = Loong.class.getDeclaredField( "school" );
//2.判断 修饰符是否为 public
if( !Modifier.isPublic( mod ) ) {
f.setAccessible( true );
}
//3.如果该字段是否为static 方法
if( Modifier.isStatic( mod ) ) {
System.out.println( f.get( Loong.class ) );//null
f.set(Loong.class, "天龙学院");
System.out.println( f.get( Loong.class ) );//天龙学院
}
//获取相应的类
final Class<?> c = Loong.class ;
//获取相应的构造
Constructor<?> con = c.getDeclaredConstructor( String.class );
//通过 con对应的构造方法来创建 c 类实例
Object a = con.newInstance( "敖广" ); // new Loong( "敖广" )
Object b = con.newInstance( "敖润" ); // new Loong( "敖润" )
final Field f = c.getDeclaredField( "name" );//获取 相应字段
final Method m = c.getDeclaredMethod( "set" , String.class );//获取 相应set 方法
// 执行方法 method.invoke(object,"参数")
System.out.println( m.invoke( a , "敖广广" ) ); // a.set( "敖广广" )
System.out.println( m.invoke( b , "敖润润" ) ); // b.set( "敖润润" )
// 获得 a 对象的 f 字段的值
System.out.println( f.get( a ) ); // a.name
System.out.println( f.get( b ) ); // b.name
final Class<?> c = Loong.class ;//类
final Loong x = new Loong() ;//实例
//从 c 类中获取方法( 实例方法 )
Method m = c.getDeclaredMethod( "set" , String.class );
//调用 x 对象 的 m 方法 并为其传入参数
Object r = m.invoke(x,"奥润");//x.set
//从 c 类中获取 assgin方法( 静态方法 )
Method m = c.getDeclaredMethod( "assign", String.class );
Object r = m.invoke(c,"天龙学院")
powered by kaifamiao