通过反射调用类的完整结构Filed/Mthod/Constructor/Superclass/Interface/Annatation
Person类:
package reflect;
@MyAnnotation(value="zlzx")
public class Person extends Creature<String> implements Comparable,MyInterface{
public String name;
private int age;
int id;//default修饰符的
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;
}
@MyAnnotation(value="123")
public void show(){
System.out.println("我是一个中国人");
}
public void display(String national) throws Exception{
System.out.println("我的国家是" + national);
}
@Override
public int compareTo(Object o) {
return 0;
}
class Bird{//内部类
}
}
Creature类:
package reflect;
public class Creature<T>{
public double weight;
public void breath(){
System.out.println("呼吸!");
}
}
MyInterface接口:
package reflect;
import java.io.Serializable;
public interface MyInterface extends Serializable{
}
MyAnnotation注解:
package reflect;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)//把source换成RUNTIME,让它的生命周期长一点
public @interface MyAnnotation {
String value();
}
测试类:
测试用例1TestFiled:
package reflect;
import java.lang.reflect.Field;
public class TestFiled {
//获取对应的运行时类的属性
public static void main(String[] args) {
Class claaa = Person.class;
//1.getField()只能获取到运行时类中及其父类中声明为public的属性
Field [] fields = claaa.getFields();
for(int i=0;i<fields.length;i++){
System.out.println(fields[i]);
//public java.lang.String reflect.Person.name
//public double reflect.Creature.weight//这个是父类的
}
//2.getDeclaredFields()可以获取运行时类本身声明的所有的属性
Field [] fields1 = claaa.getDeclaredFields();
for(Field f : fields1){
System.out.println(f.getName());
//控制台输出如下:
//name
//age
//id
}
}
}
测试用例2:
public static void main(String[] args) {
//权限修饰符 ,变量类型,变量名
//获取属性的各个部分的内容
Class claaa = Person.class;
Field [] fields = claaa.getDeclaredFields();
for(Field f : fields){
//1.获取每个属性的权限修饰符
int modifier = f.getModifiers();
System.out.println(modifier);// 1 2 0
String modifierStr = Modifier.toString(modifier);//public private 最后一个没显示因为id的缺省的
//2.获取属性的类型
Class type = f.getType();
System.out.println(type);//class java.lang.String int int
System.out.println(type.getName());//java.lang.String int int
//3.获取属性名
System.out.println(f.getName());//name age id
}
}
测试用例3:
public static void main(String[] args) {
//1.获取运行时类的方法
Class claaa = Person.class;
//getMethods()获取运行时类及其父类中所有声明为public的方法
Method [] method = claaa.getMethods();
for(Method m : method){
System.out.println(m);
}
System.out.println("***************************************************");
//getDeclaredMethods()获取运行时类本身的所有的方法
Method [] methods = claaa.getDeclaredMethods();
for(Method m : methods){
System.out.println(m);
}
}
测试用例4:
//注解 权限修饰符 返回值类型 形参列表 异常
public static void main(String[] args) {
Class claaa = Person.class;
Method [] method = claaa.getMethods();
for(Method m : method){
//1.获取注解
Annotation [] a = m.getAnnotations();
for(Annotation ann : a ){
System.out.println(ann);//@reflect.MyAnnotation(value=123)
}
//2.获取权限修饰符
int modifier = m.getModifiers();
String modifierStr = Modifier.toString(modifier);
System.out.println(modifierStr);
/*
* public
public
public
public
public
public
public
public
public final
public final native
public final
public
public
public native
public final native
public final native
public final native
*/
//3.获取返回值类型
Class returnType = m.getReturnType();
//System.out.println(returnType.getName());
/*
* void
void
void
void
void
boolean
java.lang.String
int
java.lang.Class
void
void
* */
//4.获取参数列表
Class [] params = m.getParameterTypes();
for(int i = 0;i < params.length;i++){
System.out.println(params[i].getName() + "args-" + i + " ");
}
/*
* java.lang.Objectargs-0
java.lang.Stringargs-0
intargs-0
java.lang.Stringargs-0
longargs-0
intargs-1
longargs-0
java.lang.Objectargs-0
* */
//5.获取异常
Class [] exc = m.getExceptionTypes();
for(int i = 0;i < exc.length;i++){
System.out.println(exc[i].getName());
/*
java.lang.Exception
java.lang.InterruptedException
java.lang.InterruptedException
java.lang.InterruptedException*/
}
}
}