开发喵星球

Java反射

开发喵星球2

面试题

1.什么是反射?

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

2.哪里用到了反射机制

1.JDBC中,利用反射动态加载了数据库驱动程序
2.Web服务器中利用反射调用了Servlet的服务方法
3.很多框架都用到了反射机制(例如Spring)注入属性,调用方法

3.动态代理是什么?有哪些应用?怎么实现动态代理?

1.动态代理是运行时动态生成代理类
2.动态代理的应用有SpringAOP 数据查询,Java注解对象获取等
3.如何实现动态代理:JDK原生动态代理和 cglib 动态代理。JDK原生动态代理是基于接口实现的,而cglib是基于继承当前类的子类实现的

4.Java反射机制的作用

1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时获取任意一个类所具有的成员变量和方法
4.在运行时调用任意一个对象的方法

1.获取字段

  //获得在 c 类中直接定义的所有字段
Field[] fields = c.getDeclaredFields();

//获得在 c 类及其 继承的 public字段中 获的所有字段
Field[] fields = c.getFields();

 // 根据字段名称从本类直接声明的字段中获得指定字段
Field f = c.getDeclaredField( "name" ); // NoSuchFieldException

 // 从本类及其继承的 public 字段中获得指定名称的字段
Field f = c.getField( "name" );

2.获取方法

 // 获得在 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 );

3.获取内部类

 // 直接获取在 Beast 类中定义的内部类或内部接口
 Class<?>[] classes = Beast.class.getDeclaredClasses();

// 获取 Beast 类中 公开的 内部类或接口 , 或者获得其父类中 公开的 内部类或接口
 classes = Beast.class.getClasses();

4.获取构造

 // 获得本类定义的所有构造方法(不考虑访问修饰符的影响)
 Constructor<?>[] constructors = c.getDeclaredConstructors();

 // 仅获得本类中 public 修饰的构造方法
Constructor<?>[] constructors = c.getConstructors();

5.获取字段的值,并为其赋值

//通过 创建实例为 字段赋值
//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 ) );//天龙学院
        }

6.通过Constructor来创建类的实例

//获取相应的类  
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

7.通过反射调用 实例方法 和 类方法

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,"天龙学院")
   
分类:技术栈 作者:少爷 发表于:2023-09-01 09:13:19 阅读量:83
<<   >>


powered by kaifamiao