JAVA反射机制03

通过反射调用类的完整结构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*/
            }
        }
        
    }

转载于:https://my.oschina.net/u/3686592/blog/2246178

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值