反射的基本用法

反射给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代表类中的方法:

 获取要操作的方法
需要将方法名和传入参数类型声明正确才行
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;
	}


总结:只描叙了用法,具体分析大神链接: http://blog.csdn.net/annaleeya/article/details/8240510




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值