Java的反射

1、reflection

  • 定义Student类:

      public class Student {
          //定义字段:name
          private String name;
          //无参构造
          public Student() {
          }
          //有参构造,并假设抛出RuntimeException 的异常
          public Student(String name) throws RuntimeException {
              super();
              this.name = name;
          }
          //定义无参方法
          private void showName(){
              System.out.println(this.name);
          }
           //定义有参方法
          private static void eat(String food)throws RuntimeException{
              System.out.println("我平常喜欢吃"+food);
          }
      }
    
  • 获取Field的基本信息:

      public class FieldTest {
      	public static void main(String[] args)  throws Exception{
    
          //加载并返回student类对应的class对象
          Class<?> s=Student.class;
          
          //获得s对应的类中名称是name的字段
          Field f = s.getDeclaredField("name");
          
      	  //从本类所声明的所有构造中获取带有指定类型参数的构造方法
     	  Constructor<?> con = s.getConstructor();
     	  
          // 通过由 Constructor 提供的方法来创建 con 所表示的类型的实例
     	  Object o=con.newInstance();
          
          //使f所表示的字段不管是什么权限修饰的都能够被访问
          f.setAccessible(true);
          
          //给o所引用的对象的f所表示的字段赋值
          f.set(o,"小种子");
          
          //获取o引用的对象的f所表示的字段的值
          Object n = f.get(o);
          System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>"+n);
          
          //用整数类型返回用 Field 对象表示的f所表示的字段的java访问修饰符
          int mod = f.getModifiers();
          
          //如果整数表示的字段访问修饰符是private类型则返回true,否则返回false
          System.out.println(Modifier.isPrivate(mod));
          
          //返回整数所表示的访问修饰符标志的字符串
          String type = Modifier.toString(mod);
          System.out.println(">>>>>>>>>>>>>>>>>>>>>>>"+type);
          
          //获取f所表示的字段的类型
          Class<?> t = f.getType();
          System.out.println(">>>>>>>>>>>>>>>>>>>"+t);
          
          //获取字段类型所对应的类名
          String m = t.getName();
          System.out.println(">>>>>>>>>>>>>>>>>>>>>>"+m);
          
          //获取f所表示的字段的名称
          String g = f.getName();
          System.out.println(">>>>>>>>>>>>>>>>"+g);
    
       }
     }
    
  • 获取Method的基本信息:

      public class MethodInvokeTest {
      	public static void main(String[] args) throws Exception{
    
          //加载并返回Student类对应的class对象
          Class<?> s=Student.class;
          
          //获取s对应的类中名称为eat,且带有一个String类型参数的 方法
          Method m = s.getDeclaredMethod("eat", String.class);
          System.out.println(">>>>>>>>>>>>>>>>"+m);
          
          //从本类所声明的所有构造中获取带有指定类型参数的构造方法
          Constructor<?> con = s.getConstructor();
          
          // 通过由 Constructor 提供的方法来创建 con 所表示的类型的实例
          Object o=con.newInstance();
          
          //使m所表示的非public修饰的方法能够被执行
          m.setAccessible(true);
          
          //通过o引用的对象执行m对应的带有一个参数的实例方法
          m.invoke(o,"零食");
    
          //获取m所表示的方法的访问修饰符的整数值
          int mod = m.getModifiers();
          System.out.println(mod);
          
          //如果m所表示的方法的访问修饰符的类型是private则返回true,否则返回false
          System.out.println(Modifier.isPrivate(mod));
          
          //获取整数值的访问修饰符的字符串
          String t = Modifier.toString(mod);
          System.out.println(">>>>>>>>>>>>>>"+t);
    
          //获取m所表示的方法的返回值类型
          Class<?> r = m.getReturnType();
          System.out.println(">>>>>>>>>>>"+r.getName());
    
          //获得m所表示的方法的名称
          String g = m.getName();
          System.out.println(">>>>>>>>>>>>>>>>"+g);
    
          //获取m所表示的方法的参数的类型
          Class<?>[] p = m.getParameterTypes();
          if(p !=null && p.length>0){
              for(Class<?> c:p){
                  System.out.println(">>>>>>>>>>>>>>"+c.getName());
              }
          }
    
          Class<?>[] e = m.getExceptionTypes();
          if(e !=null && e.length>0){
              for(Class<?> c:e){
                  System.out.println(">>>>>>>>>>>>>>"+c.getName());
              }
          }
      }
    }
    
1.1、java.lang.Class
1.1.1、理解Class和Object
1.1.2、获得类的基本信息
  • 获取类的基本信息
    String getName() 
        以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称
        
    String getSimpleName() 
        返回源代码中给出的底层类的简称
        
    String	getCanonicalName()
        返回 Java Language Specification 中所定义的底层类的规范化名称

    int	getModifiers() 
              返回此类或接口以整数编码的 Java 语言修饰符
  • 与类型判断有关的方法
    boolean	isAnnotation()  如果此 Class 对象表示一个注释类型则返回 true
    boolean	isArray()   判定此 Class 对象是否表示一个数组类
    boolean	isEnum()   当且仅当该类声明为源代码中的枚举时返回 true
    boolean	isInterface()  判定指定的 Class 对象是否表示一个接口类型
  • 与父类或所实现接口有关的方法
    Class<? super T>	getSuperclass()   
        返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class
        
     Class<?>[]	getInterfaces()
        确定此对象所表示的类或接口实现的接口
  • 与类加载有关的方法
    public  static Class<?>	forName( String className )  
        返回参数指定的类名或接口名相关联的 Class 对象
    public  static Class<?>	forName( String name , boolean initialize , ClassLoader loader ) 
        使用给定的 "类加载器" ( loader ) ,加载指定 类名或接口名 相关联的 Class 对象,并指定是否需要初始化( initialize )
  • 与内部类有关的方法
    Class<?>	 getDeclaringClass()
        如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。
        比如 A 类定义在 B 类内部,如果需要通过 A 获得它所在那个类,则可以通过 A.class.getDeclaringClass()
    boolean	isAnonymousClass() 
              当且仅当底层类是匿名类时返回 true
    boolean	isMemberClass() 
              当且仅当底层类是成员类时返回 true。
    boolean	isLocalClass() 
              当且仅当底层类是本地类时返回 true
1.1.3、获取Field
    Field   getDeclaredField( String name ) 获取指定名称的字段(仅限本类直接声明的字段、权限修饰符不限)
    Field   getField( String name )  从 本类及从父类继承的所有的 public 修饰的字段 中获取指定名称对应的字段
    Field[]   getDeclaredFields() 获取本类中直接声明的所有的字段组成的数组(权限修饰符不限)
    Field[]   getFields()  获取本类及从父类继承的所有的 public 修饰的字段
1.1.4、获取Method
    Method   getDeclaredMethod( String name , Class<?> ... paramTypes ) 获取指定名称、带有指定类型参数的方法(仅限本类直接声明的、权限修饰符不限)
    Method   getMethod( String name , Class<?> ... paramTypes )  从 本类及从父类继承的所有的 public 修饰的方法 中获取指定名称、带有指定类型参数的方法
    Method[]   getDeclaredMethods() 获取本类中直接声明的所有的方法组成的数组(权限修饰符不限)
    Method[]   getMethods()  获取本类及从父类继承的所有的 public 修饰的方法
1.1.5、获取Constructor
    Constructor<?>   getDeclaredConstructor( Class<?> ... paramTypes ) 从本类所声明的所有构造中获取带有指定类型参数的构造方法
    Constructor<?>   getConstructor( Class<?> ... paramTypes )  从本类所有的 public 修饰的构造中获取带有指定类型参数的构造方法
    Constructor<?>[]   getDeclaredConstructors() 获取本类中所声明的所有的构造方法(权限修饰符不限)
    Constructor<?>[]   getConstructors()  获取所有的 public 修饰的构造方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值