1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java—使用反射对类进行操作(Class对象获取类名 包名 父类 接口 构造方法 普通方法 属性)

java—使用反射对类进行操作(Class对象获取类名 包名 父类 接口 构造方法 普通方法 属性)

时间:2024-06-13 08:24:10

相关推荐

java—使用反射对类进行操作(Class对象获取类名 包名 父类 接口 构造方法 普通方法 属性)

(一)Class对象获取类名,包名,父类,接口

前提条件:

有两个接口IMessage,SystemEdition

一个父类Father

一个子类Son继承父类,实现两个接口IMessage,SystemEdition

package www.fanfaninterface IMessage{}interface SystemEdition{}class Father{}class Son extends Father implements IMessage,SystemEdition{}

Class对象获取 本类信息 与 本类全限定类名

Class sonClass = Son.class;System.out.println(sonClass);//获取本类信息System.out.println(sonClass.getName());//获取本类全限定名

Class对象获取 包的信息 与 包的全限定名

//获取包Package packages = sonClass.getPackage();System.out.println(packages);//获取包的信息System.out.println(packages.getName());//获取报的权限顶名称

Class对象获取 父类信息 与 父类全限定类名 与 类名

如果没有继承任何父类,则父类默认为Object类

//获取父类Class superClass = sonClass.getSuperclass();System.out.println(sonClass);//弗雷信息System.out.println(sonClass.getName());//父类全限定名System.out.println(sonClass.getSimpleName());//父类名

Class对象获取接口信息 与 接口全限定名

如果该类没有实现接口,则返回空数组

Class[] interfaceClass = sonClass.getInterfaces();for (Class i:interfaceClass){System.out.println(i);//接口的信息System.out.println(i.getName());//接口的全限定名}

(二)反射调用构造方法

Class类通过反射实例化类对象的时候,只能够调用类中的无参构造。如果现在类中没有无参构造则无法使用Class类调用,只能够通过明确的构造调用实例化处理。

获取所有的构造方法;获取某一个构造方法。

前提:

有一个Person类,里面有不同参数的构造方法

package www.fanfan;class Person{private String name;private Integer age;public Person() {}public Person(String name) {this.name = name;}public Person(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}}

(1)创建Person类的Class对象

Class personClass = Person.class;

(2)调用所有的构造方法

所有的构造方法肯定用数组存放。

//获取Person类所有的构造方法Constructor[] constructors = personClass.getConstructors();//打印每一个构造方法全限定名和参数类型for (Constructor i:constructors){System.out.println(i.getName()+"("+ Arrays.toString(i.getParameterTypes())+")");}

(3)调用某一个构造方法

在获取某一个构造方法的时候,要注意标明其参数类型

Constructor c = personClass.getConstructor(String.class);//参数类型Object obj = c.newInstance("alice");System.out.println(obj.getClass().getName());System.out.println(obj);

(三)反射调用普通方法

(1)取得全部普通方法;

(2)取得某个普通方法;

(3)调用。

具体使用方法如下:

前提:有一个Person类,与上面的Person类完全一样。

(1)创建一个Class对象。

Person person = new Person("jack",20);Class personClass = person.getClass();

(2)反射调用Person类中的全部方法。

全部方法肯定用数组存放。

//获取所有的普通方法Method[] methods = personClass.getMethods();//打印数组中的普通方法System.out.println("Person类中所有方法。");for (Method i:methods){System.out.println(i.getName()+"("+Arrays.toString(i.getParameterTypes())+")");}

(3)反射调用Person类中的某一方法

1)调用普通方法之前一定要有实例化对象;

2)取得所调用方法的实例化对象,并且设置方法名称和参数类型;

3)通过Method类对象调用指定的方法,并且传入参数。

此处为调用setter,getter方法。

//取得setName方法的实例化对象,并且设置方法名称和参数类型Method setNameMethod = personClass.getMethod("setName",String.class);//通过setName方法的实例化对象,调用指定方法并且传入参数。setNameMethod.invoke(person,"张三");//调用getName方法,类似Method getNameMethod = personClass.getMethod("getName");System.out.println(getNameMethod.invoke(person));

(四)反射调用属性

使用反射调用类中属性之前必须有类的实例化对象;可以获取的属性:

1)通过getFields()获取弗雷全部属性;

2)通过getField(…)获取父类某一属性;

3)通过getDeclaredFields()获取本类全部属性;

4)通过getDeclaredMethod(…)获取本类某一属性。在java.lang.reflect.Field下有两个重要方法“

1)set:设置属性内容;

2)get:取得属性内容。取得属性类型getType()

具体使用如下:

前提,有两个类,一个Animal父类,一个Dog子类

class Animal{public String name;public Integer age;}class Dog extends Animal{private Integer weight;}

(1)创建Dog类的对象和Class的对象

Dog dog = new Dog();Class classDog = dog.getClass();

(2)获取父类的全部属性

Field[] fields1 = classDog.getFields();for (Field f:fields1){System.out.println(f);}

(3)获取本类的全部属性

Field[] fields2 = classDog.getDeclaredFields();for (Field f:fields2){System.out.println(f);}

(4)获取本类的某一个方法

使用set()方法设置其属性值;

使用 get()获得其属性值;

使用getType()方法获得属性的类型。

Field field = classDog.getField("name");field.set(dog,"小狗");System.out.println(field.get(dog));System.out.println(field.getType().getName());System.out.println(field.getType().getSimpleName());

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。