- 反射是什么
- 反射的东西是什么
-
- 一个类的组成部分
- 1:变量
- 2:方法
- 3:构造方法
-
- 反射步骤
- 1:字节码文件
- 2:字节码对象
1.封装实体类
public class Student {
//成员变量
private String name;
private String sex;
private int age;
private String lick = “火龙果”;
//构造方法,三个参数
public Student(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
//私有化构造方法,一个参数
private Student(String name) {
this.name = name;
}
//无参构造方法
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 +
'}';
}
}
2.main页面
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button Field_Btn;
private Button Method_Btn;
private Button Concur_Btn;
private Student mStu;
private Class aClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//1.首先获得字节码对象
mStu = new Student();
aClass = mStu.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();
break;
//方法
case R.id.Method_Btn:
getMothods();
break;
case R.id.Concur_Btn:
getConstructors();
break;
}
}
//反射获取属性
private void getField() {
//所有的public修饰的变量
// aClass.getFields();
//获取所有的成员变量
Field[] fields = aClass.getDeclaredFields();
for (Field f : fields) {
Log.e("变量", f.getName());
}
try {
//获取单个成员变量
Field field = aClass.getDeclaredField("lick");
//java语法规定 私有化的东西只能在本类访问 反射提供一个方法加暴力访问对象
field.setAccessible(true);
Object o = field.get(mStu);
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);
Object o = aClass.newInstance();
name.set(o,"haha");
Log.e("给属性赋值",name.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
private void getMothods(){
//得到所有成员方法
Method[] methods = aClass.getDeclaredMethods();
for(Method m : methods ){
Log.e("查看有几个方法",m.getName());
}
//String name -->参数一:要找的那个方法名
//Class<?>...parameterTypes -->参数二:传入的是字节码文件,而且是跟要找到的方法里面的参数(而定)走的
try {
Method info = aClass.getDeclaredMethod("getInfo", String.class, String.class, int.class);
//暴力反射
info.setAccessible(true);
Object o = aClass.newInstance();
info.invoke(o,"张三","男",18);
} catch (Exception e) {
e.printStackTrace();
}
}
private void getConstructors(){
Constructor[] constructors = aClass.getConstructors();
for(Constructor c:constructors){
Log.e("构造方法有:",c.getName());
}
try {
Constructor constructor = aClass.getConstructor(String.class, String.class, int.class);
Object o = constructor.newInstance("aa","bb",17);
Log.e("获取构造", constructor.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.xml页面
<Button
android:id="@+id/Field_Btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="成员变量" />
<Button
android:id="@+id/Method_Btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="成员方法" />
<Button
android:id="@+id/Concur_Btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="构造方法" />