由於反射比較抽象,這也是反射的基操,所以沒效果圖,直接上代碼:
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 + '\'' +
'}';
}
}