前提条件:
有两个接口IMessage,SystemEdition
一个父类Father
一个子类Son继承父类,实现两个接口IMessage,SystemEdition
package www.fanfan
interface IMessage{
}
interface SystemEdition{
}
class Father{
}
class Son extends Father implements IMessage,SystemEdition{
}
Class sonClass = Son.class;
System.out.println(sonClass);//获取本类信息
System.out.println(sonClass.getName());//获取本类全限定名
//获取包
Package packages = sonClass.getPackage();
System.out.println(packages);//获取包的信息
System.out.println(packages.getName());//获取报的权限顶名称
//获取父类
Class superClass = sonClass.getSuperclass();
System.out.println(sonClass);//弗雷信息
System.out.println(sonClass.getName());//父类全限定名
System.out.println(sonClass.getSimpleName());//父类名
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;
}
@Override
public 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));
具体使用如下:
前提,有两个类,一个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());