反射(二)---newInstance、get\set、invoke

来源:互联网 发布:获取数组赋值的长度 编辑:程序博客网 时间:2024/05/17 03:21

Person

package com.harvic.blog_reflect_3;import android.util.Log;import java.util.ArrayList;public class Person {private int age;private String name;public Person() {}private Person(int age, String name) {this.age = age;this.name = name;}private Person(Integer age, String name) {this.age = age;this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Boolean testInvoke(Integer age, String name) {Log.d("qijian", "得到参数age:" + age + "   name:" + name);return true;}}

MyActivity

package com.harvic.blog_reflect_3;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import android.support.v4.app.Fragment;import android.widget.PopupWindow;public class MyActivity extends Activity {private String TAG = "qijian";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {newInstanceDemo();getFieldsDemo();fieldgetset();methodInvokeDemo();} catch (Exception e) {Log.e(TAG, e.getMessage());}}});}/** * 2、通过反射获取实例 */public void newInstanceDemo() throws Exception {Class<?> clazz = Person.class;Constructor<?> constructor = clazz.getDeclaredConstructor(Integer.class, String.class);constructor.setAccessible(true);// 构造实例一Person person1 = (Person) constructor.newInstance(new Integer(30),new String("harvic"));Log.d(TAG, "构造的参数为:" + person1.getName() + "  " + person1.getAge());// 构造实例二Person person2 = (Person) constructor.newInstance(50, "qijian");Log.d(TAG, "构造的参数为:" + person2.getName() + "  " + person2.getAge());try {// 构造实例三Person person3 = (Person) constructor.newInstance();person3.setAge(30);person3.setName("qijian");Log.d(TAG, "构造的参数为:" + person3.getName() + "  " + person3.getAge());} catch (Exception e) {Log.e(TAG, e.getMessage());}}/** * 4、获取属性名 */public void getFieldsDemo() throws Exception {Class<?> clazz = Person.class;// 1、枚举Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);Log.d(TAG, "枚举到的field:" + field.getName());}// 2、指定名称Field field = clazz.getDeclaredField("age");field.setAccessible(true);Log.d(TAG, "得到age对应的field:" + field.getName());}/** * 5、获取或设置指定类对象中某变量的值时,可以使用Field中的get,set方法 */public void fieldgetset() throws Exception {Class<?> clazz = Person.class;Constructor<?> constructor = clazz.getConstructor();Person person = (Person) constructor.newInstance();// 示例1:get() set()函数Field fName = clazz.getDeclaredField("name");fName.setAccessible(true);fName.set(person, "qijian");String val = (String) fName.get(person);// 利用set设置Log.d(TAG, "fieldName:" + val + "   personName:" + person.getName());// 示例2:getInt()与setInt()Field fAge = clazz.getDeclaredField("age");fAge.setAccessible(true);fAge.setInt(person, 20);Log.d(TAG,"fieldAge:" + fAge.getInt(person) + "   personAge:"+ person.getAge());// 示例3:给声明为原始类型的变量使用get()、set()Field fAge2 = clazz.getDeclaredField("age");fAge2.setAccessible(true);fAge2.set(person, 30);Integer ageval = (Integer) fAge2.get(person);Log.d(TAG,"fieldAge:" + ageval.toString() + "   personAge:"+ person.getAge());}/** * 7、Invoke函数无疑是Method类中最重要的方法,它的功能是用于执行Method对象所对应的函数 */public void methodInvokeDemo() throws Exception {Class<?> clazz = Person.class;Person person = new Person();Method method = clazz.getDeclaredMethod("testInvoke", Integer.class,String.class);method.setAccessible(true);Boolean result = (Boolean) method.invoke(person, 25, "I m harvic");Log.d(TAG, "执行结果:" + result);}}


0 0