Java基础之—反射(三)

举报
brucexiaogui 发表于 2021/12/29 23:44:51 2021/12/29
【摘要】 Java基础之—反射(三) 一、概述 介绍Class类属性获得类的构造器、方法、属性、注解 二、反射获取类的构造器 import java.lang.reflect.Constructor; class Employee{ private String name; private int age; private Emplo...

Java基础之—反射(三)

一、概述

介绍Class类属性获得类的构造器、方法、属性、注解

二、反射获取类的构造器


      import java.lang.reflect.Constructor;
      class Employee{
     	private String name;
     	private int age;
     	private  Employee() {
      	}
      	Employee(String name) {
      	}
     	public Employee(String name,Integer age) {
      	}
      }
      public class ConstructorDemo {
     	public static void main(String[] args) throws Exception {
     		//得到Employee的所有的构造器
      		Class<Employee> clz = Employee.class;
     		//类的所有公共构造方法
      		Constructor<Employee>[] cs = (Constructor<Employee>[]) clz.getConstructors();
     		for (Constructor<Employee> c : cs) {
      			System.out.println(c);
      		}
     		//得到public指定的构造器
     		//Employee(String name,int age) 
     		//Constructor<Employee> con=clz.getConstructor(String.class,int.class);
     		//Employee(String name,Integer age) 
      		Constructor<Employee> con=clz.getConstructor(String.class,Integer.class);
      		System.out.println(con);
     		//===========================================
     		/**
       * 访问不受访问权限控制:
       * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
       返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
       Constructor<?>[] getDeclaredConstructors()
       */
      		cs = (Constructor<Employee>[]) clz.getDeclaredConstructors();
     		for (Constructor<Employee> c : cs) {
      			System.out.println("-->"+c);
      		}
      		con = clz.getDeclaredConstructor();//无参
      		System.out.println(con);
      	}
      }
  
 

三、反射获取类的方法


      import java.lang.reflect.Method;
      public class MethodDemo {
     	void show(){}
     	public void say(){}
     	public static void main(String[] args) throws Exception {
      		Class<MethodDemo> clz = MethodDemo.class;
     		//拿到子类及其父类里所有的public修饰的方法
      		Method[] ms = clz.getMethods();
     		for (Method m : ms) {
      			System.out.println(m);
      		}
     		//拿到子类及其父类里所有的public修饰的指定的方法
     		Method m = clz.getMethod("main", String[].class);
      		System.out.println(m);
     		//=============================================
      		System.out.println("==================================");
     		//获取自己类里的所有方法或指定的一个方法,和访问权限无关
      		ms = clz.getDeclaredMethods();
     		for (Method method : ms) {
      			System.out.println(method);
      		}
      		m = clz.getDeclaredMethod("show");
      		System.out.println(m);
     		//===================================
      		m = clz.getMethod("toString");
      		System.out.println(m);
     		//Exception in thread "main" java.lang.NoSuchMethodException: base.MethodDemo.toString()
      		m = clz.getDeclaredMethod("toString");
      		System.out.println("-->"+m);
      	}
      }
  
 

四、反射获取类的字段


      import java.lang.reflect.Field;
      class A{
     	protected String name;
     	private int	 age;
     	public char c;
      }
      public class FieldDemo extends A {
     	private String hahha;
     	public boolean s;
     	public static void main(String[] args) throws Exception {
      		Class<FieldDemo> clz = FieldDemo.class;
     		//获得所有的public 字段,包括继承
      		Field[] fs = clz.getFields();
     		for (Field field : fs) {
      			System.out.println(field);
      		}
     		//指定的一个 public的,包阔继承
     		Field f = clz.getField("c");
      		System.out.println(f);
     		//得到所有的字段,只能获取当期类里面的,和访问权限无关
      		fs = clz.getDeclaredFields();
     		for (Field field : fs) {
      			System.out.println("-->"+field);
      		}
     		//获得当前类指定一个字段,和访问权限无关 
      		f = clz.getDeclaredField("hahha");
      		System.out.println(f);
      	}
      }
  
 

五、反射获取类的注解


      import java.lang.annotation.Annotation;
      import java.lang.annotation.Inherited;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      @Inherited//可继承的
      @Retention(RetentionPolicy.RUNTIME)
      @interface Tag{
      }
      @Tag
      class Super1{
      }
      @Deprecated
      @SuppressWarnings("all")
      public class AnonationDemo extends Super1{
     	public static void main(String[] args) {
      		Class<AnonationDemo> clz = AnonationDemo.class;
     		//所有的标签,但是是RUNTIME类型,可以获取继承过来的
      		 Annotation[] as = clz.getAnnotations();
      		 System.out.println(as.length);
     		 for (Annotation a : as) {
      			System.out.println(a);
      		}
     		 //<A extends Annotation> A getAnnotation(Class<A> annotationClass) 
     		 //获得类上时候有执行的Annotation标准
     		 Deprecated d =  clz.getAnnotation(Deprecated.class);
     		 // Annotation[] getDeclaredAnnotations() 返回直接存在于此元素上的所有注释不包括继承的。 
      		 System.out.println(clz.getDeclaredAnnotations().length);
     		 //表示 某个类上是有有annotationClass标签标注
     		 // boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) 
     		 //包括继承的
     		boolean b =  clz.isAnnotationPresent(Tag.class);
      		System.out.println(b);
     		if(b){
      			clz.getAnnotation(Tag.class);
      		}
      	}
      }
  
 

 

文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/95516288

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。