java--反射常用方法(三)

举报
brucexiaogui 发表于 2021/12/29 23:59:59 2021/12/29
【摘要】 java--反射常用方法(三) 一、Class中获取构造方法   Constructor类用于描述类中的构造方法:Constructor<T> getConstructor(Class<?>... parameterTypes)  返回该Class对象表示类的指定的public构造...

java--反射常用方法(三)

一、Class中获取构造方法

 

  • Constructor类用于描述类中的构造方法:
  • Constructor<T> getConstructor(Class<?>... parameterTypes) 

返回该Class对象表示类的指定的public构造方法; 

 

  • Constructor<?>[] getConstructors()

返回该Class对象表示类的所有public构造方法; 

 

  • Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

返回该Class对象表示类的指定的构造方法,和访问权限无关;

 

  • Constructor<?>[] getDeclaredConstructors() 

 

返回该Class对象表示类的所有构造方法,和访问权限无关;

 

Class中获取构造方法实例


      package reflect;
      import java.lang.reflect.Constructor;
      import java.util.Date;
      class Person {
     	//没有使用public修饰的类的默认构造器的访问修饰符是啥?
     	//一个类的默认的构造器的访问权限和类的访问权限一致;
      }
      public class ConstructorDemo {
     	public static void main(String[] args) throws Exception {
     		// 得到Person里所有公共的构造器
     		// 先得到Person的字节码
      		Class<Dept> clz = Dept.class;
     		// 获得Person里所有public的构造器
      		Constructor<?>[] cs = clz.getConstructors();//只能获得公共 的构造器
     		//Constructor<?>[] cs = clz.getDeclaredConstructors();//所有的构造器
      		System.out.println(cs.length);
     		for (Constructor<?> c : cs) {
      			System.out.println(c);
      		}
     		//===========================================
     		//获得指定的构造器 protected Dept(int age)
     		/**
       * Constructor<T> getConstructor(Class<?>... parameterTypes)
       获得Class所表示类的指定的public修饰的构造器;
       Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
       获得Class所表示类的指定的构造器,和访问权限无关;
       */
     		//Constructor<Dept> con = clz.getConstructor(int.class);
      		Constructor<Dept> con = clz.getDeclaredConstructor(int.class);
      		System.out.println("-->"+con);
     		//获得 private Dept()
      		con = clz.getDeclaredConstructor();
      		System.out.println(con);
     		//获得protected Dept(int age,Date d) 
      		con = clz.getDeclaredConstructor(int.class,Date.class);
      		System.out.println(con);
      	}
      }
  
 

二、Class获取Method

 

  • Method类用于描述类中的方法:
  • Method getMethod(String name, Class<?> ... parameterTypes) 

返回该Class对象表示类和其父类的指定的public方法; 

 

  • Method[] getMethods():  

返回该Class对象表示类和其父类的所有public方法; 

 

  • Method getDeclaredMethod(String name, Class<?>... parameterTypes) 

返回该Class对象表示类的指定的方法。和访问权限无关,但不包括继承的方法;

 

  • Method[] getDeclaredMethods(): 获得类所有的方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法;

Class获取Method实例


      package reflect;
      import java.lang.reflect.Method;
      import java.lang.reflect.Modifier;
      import java.util.Date;
      import java.util.List;
      class Sub extends Object {
     	private void show1() {
      	}
     	void show2() {
      	}
     	protected void show3() {
      	}
     	public void show4() {
      	}
     	@Deprecated
     	public  void  ooxx(byte[] bys, int age, Integer i1, String name, Date bornDate){}
      }
      public class MethodDemo {
     	public static void main(String[] args) throws Exception {
     		// 得到Object里所有的public修饰的方法
      		Class<Sub> clz = Sub.class;
     		/**
       * Method[] getMethods() 得到Class所表示类的所有的public修饰的方法,包括继承过来的方法 Method[]
       * getDeclaredMethods() 和访问权限无关,不包括继承过来的的方法
       */
     		// Method[] ms = clz.getMethods();
      		Method[] ms = clz.getDeclaredMethods();
     		for (Method m : ms) {
      			System.out.println(m);
      		}
      		System.out.println("-0--------------------------");
     		//获得指定的方法;
     		/**
       * Method getMethod(String methodName, Class<?>... parameterTypes) :public修饰的方法
       * Method getDeclaredMethod(String methodName, Class<?>... parameterTypes) 和权限无关,不包括继承的
       */
     		//只获得protected void show3()
     		Method m = clz.getDeclaredMethod("show3");
      		System.out.println(m);
     		//获得public void ooxx(byte[] bys, int age, Integer i1, String name, Date bornDate)
      		m  = clz.getMethod("ooxx", byte[].class, int.class,Integer.class,String.class,Date.class);
      		System.out.println(m);
      		System.out.println(m.getName());
      		System.out.println(Modifier.toString(m.getModifiers()));
      		System.out.println(m.getReturnType());
     		//Arrays: 得到 public static <T> List<T> asList(T... a)
      	}
      }
  
 

三、Class中获取Field

 

  • Field类用于描述类中的字段:
  • Field getField(String name) 

返回该Class对象表示类和其父类的指定的public字段;  

 

  • Field[] getFields() 

返回该Class对象表示类和其父类的所有public字段;

 

  • Field getDeclaredField(String name) 

返回该Class对象表示类的指定的字段和访问权限无关,但不包括继承的字段; 

 

  • Field[] getDeclaredFields()

 

返回当前Class对象中公共、保护、默认(包)访问和私有字段,但不包括继承的字段;    

 

Class中获取Field实例


      package reflect;
      import java.lang.annotation.Annotation;
      import java.lang.reflect.Field;
      import java.lang.reflect.Modifier;
      import java.util.Date;
      class People{
     	public String name;
      }
      class Student extends People{
     	@Deprecated
     	private int age;
     	public Date bornDate;
      }
      public class FieldDemo {
     	public static void main(String[] args) throws Exception {
      		Class<Student> clz = Student.class;
     		/**
       * Field[] getFields() : 得到Class所表示类的所有的public修饰的字段,包括继承的
       * Field[] getDeclaredFields() : 得到Class所表示类的所有的字段和访问权限无关,不包括继承的
       */
     		//Field[] fs = clz.getFields();
      		Field[]  fs = clz.getDeclaredFields();
     		for (Field field : fs) {
      			System.out.println(field);
      		}
      		System.out.println("--------------------------");
     		/**
       * 获得指定的一个字段:
       * Field getField(String filedName) : 得到Class所表示类的所有的public修饰的字段,包括继承的
       * Field getDeclaredField(String fileName) : 得到Class所表示类的所有的字段和访问权限无关,不包括继承的
       */
     		Field f = clz.getDeclaredField("age");
      		System.out.println(f.toString());
      		System.out.println(Modifier.toString(f.getModifiers()));
      		System.out.println(f.getType());
      		System.out.println(f.getName());
      		Annotation[] as   = f.getDeclaredAnnotations();
     		for (Annotation a : as) {
      			System.out.println(a);
      		}
      	}
      }
  
 

四、Class常用方法


      package reflect;
      import java.io.Serializable;
      import java.lang.reflect.Modifier;
      import java.util.Date;
      import java.util.Map;
      @Deprecated//表示过时
      class Emp implements Serializable,Comparable<Emp>{
     	 private class A{
      	}
     	 class B{
      	}
     	public int compareTo(Emp o) {
     		return 0;
      	}
      }
      public class ClassCommonMethodDemo {
     	public static void main(String[] args) {
     		//获得Emp类里的信息//Date
      		Class<Emp> clz = Emp.class;
     		/**
       * Annotation[] getAnnotations() 返回此元素上存在的所有注释。
       */
      		System.out.println(clz.getAnnotations().length);
     		/**
       * Class<?>[] getClasses()
       得到Class所描述类的所有的public修饰的内部类
       Class<?> getDeclaredClasses()
       得到Class所描述类的所有的内部类,和访问权限无关
       */
     		//Class<?>[] innerClass = clz.getClasses();
      		Class<?>[] innerClass = clz.getDeclaredClasses();
      		System.out.println(innerClass.length);
     		for (Class<?> c : innerClass) {
      			System.out.println(c);
      		}
     		/**
       * Class<?>[] getInterfaces() 确定此对象所表示的类或接口实现的接口。
       */
      		System.out.println("接口 "+clz.getInterfaces().length);
     		/**
       * int getModifiers() 返回此类或接口以整数编码的 Java 语言修饰符。
       */
     		/**
       * Modifier:
       * static String toString(int mod) 返回描述指定修饰符中的访问修饰符标志的字符串。
       */
      		Class<Date> clzDate = Date.class;
      		System.out.println(clzDate.getModifiers());//1
      		System.out.println(Modifier.toString(clzDate.getModifiers()));//public
     		/**
       * String getName() 返回Class所描述类的全限定名
       * String getSimpleName() 返回源代码中给出的底层类的简称。
       */
      		System.out.println(clz.getName());//reflect.Emp
      		System.out.println(clz.getSimpleName());//Emp
     		/**
       * Package getPackage() 获取此类的包。
       */
      		System.out.println(clz.getPackage());
     		/**
       * Class<? super T> getSuperclass()
       返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
       */
      		System.out.println("clz.getSuperclass()= " +clz.getSuperclass());
      		System.out.println(String.class.isArray());//false
      		System.out.println(String[].class.isArray());//true
      		System.out.println(Map.class.isInterface());
      		System.out.println(Gender.class.isEnum());
      		System.out.println(int[].class.isPrimitive());//
      		System.out.println(int.class.isPrimitive());
      		System.out.println(Deprecated.class.isAnnotation());
     		/**
       * <U> Class<? extends U> asSubclass(Class<U> clazz)
       强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。
       */
     		Object obj = new Date();
      		Class<Date> d  = (Class<Date>) obj.getClass().asSubclass(Date.class);
      		System.out.println(d);
     		/**
       * boolean isInstance(Object obj)
       判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
       对象 instanceof 类
       */
      		System.out.println("-->"+obj.getClass());//Date d = new Date();
     		boolean b    = Object.class.isInstance(new Date());
      		System.out.println(b);//true
      		System.out.println(Date.class.isInstance(obj));
      	}
      }
  
 

 

五、Class创建对象

 

创建对象:

  • 使用Class对象的newInstance()方法创建该Class对象的实例,此时该Class对象必须要有无参数的构造方法。
  • 使用Class对象获取指定的Constructor对象,再调用Constructor的newInstance()方法创建对象类的实例,此时可以选择使用某个构造方法。

创建对象实例


      package reflect;
      import java.lang.reflect.Constructor;
      import java.util.Date;
      class Teacher{
     	private Teacher(String name){
      		System.out.println(name);
      	}
     	public String toString() {
     		return "老师";
      	}
      }
      public class NewInstanceDemo {
     	public static void main(String[] args) throws Exception {
     	// Teacher t = new Teacher();
     		//System.out.println(t);
     		/**使用反射来创建对象
       * 1.
       * public T newInstance():只能创建非private,无参的构造方法的对象;好比 new 类();
       * T classInstance.newIntance();
       * 如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。
       *
       * 2.
       * 1>.先得到一个指定的构造方法,
       * 2>.调用构造器里的一个方法,
       * T newInstance(Object... initargs) 、
       * initargs表示构造器的需要的实际参数
       */
      		Class<Teacher> clz = Teacher.class;
     		//Teacher t2 = clz.newInstance();
     		//System.out.println(t2);
     	// System.out.println(t == t2);//false
     		//调用有参的私有构造方法
      		Constructor<Teacher> con  = clz.getDeclaredConstructor(String.class);
     		/**
       * 访问私有的成员之前:先设置其为可访问的
       *
       * AccessibleObject: 表示可访问的对象,是Contructor,Method,Filed的父类;
       * 方法: void setAccessible(boolean flag) :用来设置是否可访问的
       若要设置可访问的:
       obj.setAccessible(true);
       */
      		con.setAccessible(true);//设置可访问的
     		Teacher t = con.newInstance("will");
      		System.out.println(t);
     		//===========================
      		System.out.println("------------------");
      		createInstance();
      	}
     	//使用反射来创建java.util.Date的对象
     	public  static void  createInstance() throws Exception{
     		//new Date();
      		Class<?> clz = Class.forName("java.util.Date");
     		Date d = (Date) clz.newInstance();
      		System.out.println(d);
     		//
      		Constructor<Date> con = (Constructor<Date>) clz.getConstructor();
      		System.out.println(con.newInstance());
     		//new Date(long time);
      		con = (Constructor<Date>) clz.getConstructor(long.class);
      		System.out.println(con.newInstance(1));
      	}
      }
  
 

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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