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;
}
}
}