java—使⽤反射对类进⾏操作(Class对象获取类名,包名,⽗类,接⼝,构造
⽅法,普通⽅。。。
(⼀)Class对象获取类名,包名,⽗类,接⼝
前提条件:
有两个接⼝IMessage,SystemEdition
⼀个⽗类Father
⼀个⼦类Son继承⽗类,实现两个接⼝IMessage,SystemEdition
package www.fanfan
interface IMessage{
}
interface SystemEdition{
}
class Father{
}
class Son extends Father implements IMessage,SystemEdition{
}
1. Class对象获取 本类信息 与 本类全限定类名
Class sonClass = Son.class;
System.out.println(sonClass);//获取本类信息
System.out.Name());//获取本类全限定名
2. Class对象获取 包的信息 与 包的全限定名
//获取包
Package packages = Package();
System.out.println(packages);//获取包的信息
System.out.Name());//获取报的权限顶名称
3. Class对象获取 ⽗类信息 与 ⽗类全限定类名 与 类名
如果没有继承任何⽗类,则⽗类默认为Object类
//获取⽗类
Class superClass = Superclass();
System.out.println(sonClass);//弗雷信息
System.out.Name());//⽗类全限定名
System.out.SimpleName());//⽗类名
4. Class对象获取接⼝信息 与 接⼝全限定名
如果该类没有实现接⼝,则返回空数组
Class[] interfaceClass = Interfaces();
for(Class i:interfaceClass){
System.out.println(i);//接⼝的信息
System.out.Name());//接⼝的全限定名
}
(⼆)反射调⽤构造⽅法
Class类通过反射实例化类对象的时候,只能够调⽤类中的⽆参构造。如果现在类中没有⽆参构造则⽆法使⽤Class类调⽤,只能够通过明确的构造调⽤实例化处理。
1. 获取所有的构造⽅法;
2. 获取某⼀个构造⽅法。
前提:
有⼀个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 +
'}';
}
java接口有没有构造方法
}
(1)创建Person类的Class对象
Class personClass = Person.class;
(2)调⽤所有的构造⽅法
所有的构造⽅法肯定⽤数组存放。
//获取Person类所有的构造⽅法
Constructor[] constructors =  Constructors();
//打印每⼀个构造⽅法全限定名和参数类型
for(Constructor i:constructors){
System.out.Name()+"("
+ ParameterTypes())+")");
}
(3)调⽤某⼀个构造⽅法
在获取某⼀个构造⽅法的时候,要注意标明其参数类型
Constructor c = Constructor(String.class);//参数类型
Object obj = c.newInstance("alice");
System.out.Class().getName());
System.out.println(obj);
(三)反射调⽤普通⽅法
(1)取得全部普通⽅法;
(2)取得某个普通⽅法;
(3)调⽤。
具体使⽤⽅法如下:
前提:有⼀个Person类,与上⾯的Person类完全⼀样。
(1)创建⼀个Class对象。
Person person =new Person("jack",20);
Class personClass = Class();
(2)反射调⽤Person类中的全部⽅法。
全部⽅法肯定⽤数组存放。
//获取所有的普通⽅法
Method[] methods = Methods();
//打印数组中的普通⽅法
System.out.println("Person类中所有⽅法。");
for(Method i:methods){
System.out.Name()+"("+ParameterTypes())+")");
}
(3)反射调⽤Person类中的某⼀⽅法
1)调⽤普通⽅法之前⼀定要有实例化对象;
2)取得所调⽤⽅法的实例化对象,并且设置⽅法名称和参数类型;
3)通过Method类对象调⽤指定的⽅法,并且传⼊参数。
此处为调⽤setter,getter⽅法。
//取得setName⽅法的实例化对象,并且设置⽅法名称和参数类型
Method setNameMethod = Method("setName",String.class);
//通过setName⽅法的实例化对象,调⽤指定⽅法并且传⼊参数。setNameMethod.invoke(person,"张三");
//调⽤getName⽅法,类似
Method getNameMethod = Method("getName");
System.out.println(getNameMethod.invoke(person));
(四)反射调⽤属性
1. 使⽤反射调⽤类中属性之前必须有类的实例化对象;
2. 可以获取的属性:
1)通过getFields()获取弗雷全部属性;
2)通过getField(…)获取⽗类某⼀属性;
3)通过getDeclaredFields()获取本类全部属性;
4)通过getDeclaredMethod(…)获取本类某⼀属性。
3. 在flect.Field下有两个重要⽅法“
1)set:设置属性内容;
2)get:取得属性内容。
4. 取得属性类型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 = Class();
(2)获取⽗类的全部属性
Field[] fields1 = Fields();
for(Field f:fields1){
System.out.println(f);
}
(3)获取本类的全部属性
Field[] fields2 = DeclaredFields();
for(Field f:fields2){
System.out.println(f);
}
(4)获取本类的某⼀个⽅法
使⽤set()⽅法设置其属性值;
使⽤ get()获得其属性值;
使⽤getType()⽅法获得属性的类型。
Field field = Field("name");
field.set(dog,"⼩狗");
System.out.(dog));
System.out.Type().getName());
System.out.Type().getSimpleName());

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。