首先先定义一个china接口,一个Person类并实现此接口;
package it.javaSE;
interface china{
public static final String NATIONAL ="chian";
public static final String AUTHOR ="lemon";
public void sayChina();;
public String sayHellow(String name,int age);
}
class Person implements china{
private String name;
private int age ;
public Person(){
}
public Person(String name,int age ){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void sayChina(){
System.out.println("作者:"+AUTHOR+"国籍"+NATIONAL);
}
public String sayHellow(String name, int age)
{
return name+"的年龄是"+age+","+"会说Hellow";
}
}
现在利用反射获取Person的接口,父类名称,以及其构造方法;构造方法通过直接获取以及自定义获取;
package it.javaSE;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class ClassReflect {
public static void main(String[] args) {
System.out.println(" ~~O(∩_∩)O~~O(∩_∩)O~~");
Class <?> c1 = null;
try {
c1 = Class.forName("it.javaSE.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//取得实现的全部接口
Class<?> [] ifs = c1.getInterfaces();
/*因为接口是类的特殊形式,而且一个数组可以实现多个接口,
* 所以用Class数组的形式将全部的接口对象返回,
* 并利用循环的方式将内容依次输出;
*/
for (int i = 0; i < ifs.length; i++) {
System.out.println("实现的接口名称:"+ifs.getName());
}
System.out.println();
System.out.println(" ~~O(∩_∩)O~~O(∩_∩)O~~");
Class <?> c2 = null;
try {
c2 = Class.forName("it.javaSE.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//取得父类
Class<?> superClass = c2.getSuperclass();
System.out.println("父类名称:"+superClass.getName());
System.out.println();
System.out.println(" ~~O(∩_∩)O~~O(∩_∩)O~~");
Class <?> c3 = null;
try {
c3 = Class.forName("it.javaSE.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//取得类的全部构造方法
Constructor<?>[] cts1 = c3.getConstructors();
/*以上取得了全部的构造方法,然后通过输出Constructor对象的完整信息,
* 是比较全的信息;
*/
for (int i = 0; i < cts1.length; i++) {
System.out.println("构造方法:"+cts1);
}
System.out.println();
System.out.println(" ~~O(∩_∩)O~~O(∩_∩)O~~");
//c3取得了全部的构造方法,然后直接输出;当然,自己手工也可可以拼凑出完整信息。
Class <?> c4 = null;
try {
c4 = Class.forName("it.javaSE.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//取得类的全部构造方法
Constructor<?>[] cts2 = c4.getConstructors();
/*以上取得了全部的构造方法,然后通过输出Constructor对象的完整信息,
* 是比较全的信息;
*/
for (int i = 0; i < cts2.length; i++) {
//列出构造函数中的参数类型
Class<?>[] ps = cts2.getParameterTypes();
System.out.print("构造方法:");
System.out.print(cts2.getModifiers()+" ");
System.out.print(cts2.getName());
System.out.print("(");
for (int j = 0; j < ps.length; j++) {
System.out.print(ps[j].getName()+ " args"+j);
if (j<ps.length-1) {
System.out.print(",");
}
}
System.out.println("){}");
/*
* 从输出结果可以看出,已经去取出了构造方法的名称及参数类型,但是获取的权限是
* 一个数字而不是public,这是因为java中对于方法的修饰符是使用一定的数字表现出来的
* 如果要使数字变成用户能看懂的关键字,需用Modifier类完成。
*/
}
System.out.println();
//用Modifier类还原修饰符
System.out.println(" ~~O(∩_∩)O~~O(∩_∩)O~~");
Class <?> c5 = null;
try {
c5 = Class.forName("it.javaSE.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//取得类的全部构造方法
Constructor<?>[] cts3 = c5.getConstructors();
/*以上取得了全部的构造方法,然后通过输出Constructor对象的完整信息,
* 是比较全的信息;
*/
for (int i = 0; i < cts3.length; i++) {
//列出构造函数中的参数类型
Class<?>[] ps = cts3.getParameterTypes();
System.out.print("构造方法:");
int mo = cts3.getModifiers();
System.out.print(Modifier.toString(mo)+" ");
System.out.print(cts3.getName());
System.out.print("(");
for (int j = 0; j < ps.length; j++) {
System.out.print(ps[j].getName()+ " args"+j);
if (j<ps.length-1) {
System.out.print(",");
}
}
System.out.println("){}");
}
}
}
|
|