反射&&自定义注解

1.person类

//设置注解
@UserInfo(userName =  "张三",userPassword =  "123456")
public class Person {
    //公有属性
    public String sname;
    public String password;
    //私有属性
    private int age;

    public Person() {
    }

    public Person(String sname) {
        this.sname = sname;
    }

    public Person(String sname, String password) {
        this.sname = sname;
        this.password = password;
    }
    //私有属性
    private Person(String sname, String password, int age) {
        this.sname = sname;
        this.password = password;
        this.age = age;
    }
    public void start(int age){
        Log.d("nihao",age+"");
    }
    public void end(){
        Log.d("===",sname+"优秀");
    }
    private void star(){
        Log.d("===",sname+"星星");
    }
    @Override
    public String toString() {
        return "Person{" +
                "sname='" + sname + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

2.userinfo 用户信息

//设置为 RetentionPolicy.RUNTIME
@Retention(RetentionPolicy.RUNTIME)
//使用自定义注解的
public @interface UserInfo {
    String userName();
    String userPassword()  default "百度介绍发";

}

3.test测试

public class Test {
    /*
        反射使用
     */
    @SuppressWarnings("rawtypes")    //SuppressWarnings压制警告,即去除警告   rawtypes是说传参时也要传递带泛型的参数

    public void test() throws Exception {
        //获取类
        Class<Person> personClass = Person.class;
        @SuppressWarnings("rawtypes")
        Class aClass = new Person().getClass();
        //要使用类的全路径名
        @SuppressWarnings("rawtypes")
        Class aClass1 = Class.forName("com.liu.fanshe.Person");
        //获取属性
        Field sname = personClass.getField("sname");
        //私有属性
        Field age = personClass.getDeclaredField("age");

        //获取public单个方法
        Method end = personClass.getMethod("end");
        Method start = personClass.getMethod("start", int.class);

        //获得私有的方法
        Method star = personClass.getDeclaredMethod("star");
        //获取对应的构造方法
        Constructor constructor = personClass.getConstructor(String.class,String.class);
        //实例化对象
        Person person = personClass.newInstance();
        //通过构造方法制造实例化对象
        Person person1 = (Person) constructor.newInstance("小伙伴","哈哈哈");
        //设置属性的值  参数(对象,对应的值)
        sname.set(person1,"CTO");
        sname.set(person,"CEO");
        //暴力反射   age  设置为私有属性  可以访问
        age.setAccessible(true);
        age.set(person,3333);
        //调用方法

        //设置私有的可访问‘  暴力反射
        star.setAccessible(true);
        star.invoke(person1);
        //方法赋值
        start.invoke(person,18);
        start.invoke(person1,50);
        //调用方法
        end.invoke(person);
        //获得class文件
        Class<Person> personClass1 = Person.class;
        //获得注解的实体类
        UserInfo annotation = personClass1.getAnnotation(UserInfo.class);
        //得到对应的值
        String name = annotation.userName();
        String userPassword = annotation.userPassword();
        //校验
        if (name.equals("张三")) {
            Toast.makeText(App.mContext,"姓名没毛病",Toast.LENGTH_SHORT).show();
            if (userPassword.equals("123456")) {
                Toast.makeText(App.mContext,"密码没毛病",Toast.LENGTH_SHORT).show();
            }
        }else {
            Toast.makeText(App.mContext,"哪里出错了",Toast.LENGTH_SHORT).show();
        }

    };

}

4.app中初始化

public class App extends Application {

    public static Context mContext;
    @Override
    public void onCreate() {
        super.onCreate();
        mContext=this;
    }
}

5.主页面

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mCeshi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

    }

    private void initView() {
        mCeshi = (Button) findViewById(R.id.ceshi);

        mCeshi.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.ceshi:
                try {
                    new Test().test();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42828293/article/details/84727440