这两天重新学习了一下反射和注解
感觉比初学的时候有多收获了不少的东西.
好了话不多少,上代码吧
尽量的给每一行加上注释,算是加深自己的理解吧
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button bianliang;
private Button fangfa;
private Button gouzao;
private Student mStu;
private Class<? extends Student> mClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
mStu = new Student();
mClass = mStu.getClass();
}
private void initView() {
bianliang = (Button) findViewById(R.id.bianliang);
fangfa = (Button) findViewById(R.id.fangfa);
gouzao = (Button) findViewById(R.id.gouzao);
bianliang.setOnClickListener(this);
fangfa.setOnClickListener(this);
gouzao.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bianliang:
getField();
break;
case R.id.fangfa:
getMotheds();
break;
case R.id.gouzao:
getConstructors();
break;
}
}
//操作构造方法的
private void getConstructors() {
//得到所有的构造方法getDeclaredConstructors
Constructor<?>[] constructors = mClass.getDeclaredConstructors();
for (Constructor c : constructors) {
Log.e("构造方法", c.getName());
}
try {
Constructor<? extends Student> constructor = mClass.getDeclaredConstructor(String.class, String.class, int.class);
//暴力反射
constructor.setAccessible(true);
Object obj = mClass.newInstance();
Log.e("获取构造方法", obj.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
private void getMotheds() {
//得到所有的方法 getDeclaredMethods
Method[] methods = mClass.getDeclaredMethods();
for (Method m : methods) {
Log.e("查看方法", m.getName());
}
//参数1:代表找那个方法 参数2:1:传入的是字节码文件, 而且是跟着这个方法里面参数走的
try {
//Declared声明的 :公告的
Method info = mClass.getDeclaredMethod("getInfo", String.class, String.class, int.class);
//setAccessible 暴力反射,如果需要,设定值为true
info.setAccessible(true);
//创建一个新的反射
Object instance = mClass.newInstance();
//进行赋值
info.invoke(instance, "BigFlyRed", "最帅", 18);
} catch (Exception e) {
e.printStackTrace();
}
}
public void getField() {
//得到该类所有的成员变量getDeclaredFields
Field[] fields = mClass.getDeclaredFields();
//所有的public修饰的变量
for (Field f : fields) {
Log.e("变量", f.getName());
}
try {
Field lick = mClass.getDeclaredField("lick");
//java语法规定 私有化的东西只能在本类访问 反射提供一个方法加暴力访问对象
lick.setAccessible(true);
Object o = lick.get(mStu);
if (o instanceof String) {
Log.e("通过反射获取属性的值", o.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
//给某个属性赋值
public void setField() {
try {
Field name = mClass.getDeclaredField("name");
//暴力反射
name.setAccessible(true);
//通过反射创建一个该类对象 多态的思想,因为我知道反射的对象是谁了
Student student = mClass.newInstance();
//给属性赋值
name.set(student, "么么哒");
Log.e("给属性赋值", student.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
自定义一个student封装类.
效果只是用log打印了一下.希望能对大家有所帮助吧
然后附上注解的链接
https://blog.csdn.net/weixin_43603192/article/details/85253959
效果图就不传了,都是比较low的效果