由于反射比较抽象,这也是反射的基操,所以没效果图,直接上代码:
package com.example.a51044.fanshe;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.example.a51044.fanshe.bean.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button Field_Btn;
private Button Method_Btn;
private Button Concur_Btn;
private Student student;
private Class aClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
student=new Student();
//通过创建对象得到该类的字节码对象
aClass = student.getClass();
}
private void initView() {
Field_Btn = (Button) findViewById(R.id.Field_Btn);
Method_Btn = (Button) findViewById(R.id.Method_Btn);
Concur_Btn = (Button) findViewById(R.id.Concur_Btn);
Field_Btn.setOnClickListener(this);
Method_Btn.setOnClickListener(this);
Concur_Btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.Field_Btn:
getField();
setField();
break;
case R.id.Method_Btn:
getMotheds();
break;
case R.id.Concur_Btn:
getConstructors();
break;
}
}
private void getConstructors() {
//得到该类中所有的构造方法,不加Declared只能得到公共的构造方法
Constructor[] constructors = aClass.getDeclaredConstructors();
for(Constructor c:constructors)
{
//循环获取构造方法的名字
Log.e("构造方法",c.getName());
}
try {
//通过参数得知是哪个构造方法
Constructor constructor = aClass.getDeclaredConstructor(String.class, String.class, int.class);
Object o = constructor.newInstance("memeda", "heheh", 20);
Log.e("获取构造",o.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
private void getMotheds() {
//获取到该类的所有的方法
Method[] methods = aClass.getDeclaredMethods();
for(Method m:methods)
{
Log.e("查看方法",m.getName());
}
try {
//得到方法名为getInfo的方法,后面参数对应的是基本类里的参数
Method info = aClass.getDeclaredMethod("getInfo", String.class, String.class, int.class);
info.setAccessible(true);
//通过反射得到该类的实例
Object instance = aClass.newInstance();
info.invoke(instance,"李小强","男",18);
} catch (Exception e) {
e.printStackTrace();
}
}
private void getField()
{
//获取所有的成员变量
Field[] fields = aClass.getDeclaredFields();
for(Field f:fields)
{
//获取到所有的成员变量名字
Log.e("变量",f.getName());
}
try {
//指定获取到某个变量
Field lick = aClass.getDeclaredField("lick");
//暴力反射后可以获取到私有的
lick.setAccessible(true);
//个人理解为得到这个变量的值(仅供参考)
Object o = lick.get(student);
if(o instanceof String)
{
Log.e("通过反射获取到的属性值",o.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void setField()
{
try {
Field name = aClass.getDeclaredField("name");
name.setAccessible(true);
//通过反射创建一个该类的实例
Student instance = (Student) aClass.newInstance();
//给name属性赋值
name.set(instance,"李广强");
Log.e("给属性赋值",instance.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的基本类:
package com.example.a51044.fanshe.bean;
import android.util.Log;
public class Student {
private String name;
private String sex;
private int age;
private String lick = "lvxx 帅";
public Student(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public Student() {
}
public void getInfo(String name) {
this.name = name;
}
private void getInfo(String name, String sex,int age) {
Log.e("name和sex", name + ",sex=" + sex+",age="+age);
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", lick='" + lick + '\'' +
'}';
}
}