反射给java提供了,运行时获取一个类实例的可能,这一点非常灵活,你仅仅传一个类的全限定名,就能通过反射,来获取对应的类实例,我们一般会用Class类,来调用这个被反射的Objcet类下的:构造方法,属性,或方法等。
反射的优缺点如下:
优点:
A:能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
B:与Java动态编译相结合,可以实现无比强大的功能
缺点:
A:使用反射的性能较低
B:使用反射相对来说不安全
C:破坏了类的封装性,可以通过反射获取这个类的私有方法和属性
类属性:
获取字节码文件
通过类的全限定名获取
try {
Class c1 = Class.forName(“包名位置”);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
直接创建对象(调用默认无参构造方法),类里必须要有默认构造方法 */
cla为字节码对象
Object obj1 = cla.newInstance();
通过有参构造方法创建对象 */
Constructor has = cla.getDeclaredConstructor(String.class, int.class); // 形参
Object obj3 = has.newInstance(“xxx”, 23); // 传入的是实参
获取要操作的方法
需要将方法名和传入参数类型声明正确才行
Method showNo = cla.getDeclaredMethod(“show”);
Method showHas = cla.getDeclaredMethod(“show”, String.class);
Method calc = cla.getDeclaredMethod(“calc”, int.class, double.class);
calc.setAccessible(true);
package com.example.reflecr;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Toast;
import java.lang.reflect.Method;
import android.content.Context;
import android.os.Bundle;
import android.os.IBinder;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
Toast.makeText(getApplicationContext(), "开始", 0).show();
String result =null;
test();
}
public void test(){
// 1,获取字节码文件
try
{
Class> clazz = Class.forName("com.example.reflecr.Reflex");
// 2,获取方法
Method method = clazz.getMethod("getReflex");
//3,创建对应字节码类的实例对象
Reflex reflex = (Reflex) clazz.newInstance();
//4,调用方法,拿到返回的string"测试"
String value = (String) method.invoke(reflex);
Toast.makeText(getApplicationContext(),value+"成功" , 1).show();
//吐司"测试成功"
}catch(
Exception e)
{
e.printStackTrace();
}
}
}
package com.example.reflecr;
import android.app.Activity;
import android.util.Log;
public class Reflex extends Activity {
private static String getReflex() {
Log.i("TAG", "进来了反射");
String reflexResult ="测试";
return reflexResult;
}