反射的基本用法

反射给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




在Java中,反射(Reflection)是一种强大的工具,它允许你在运行时检查、创建或修改程序的类、接口、字段和方法等信息。如果你需要在不确定对象的具体类型的情况下调用其方法,你可以使用反射。 以下是一个基本的步骤来通过反射动态地调用方法: 1. 获取`Class`对象:首先,你需要获取你要操作的对象所在的类的`Class`对象。这通常从`Class.forName()`方法开始,如果知道全名可以直接传递,否则通过对象实例得到。 ```java Class<?> clazz = MyClass.class; // 或者 Class.forName("com.example.MyClass"); ``` 2. 获取方法:然后找到特定的方法。你可以指定方法名和参数类型。如果没有明确指定参数类型,`Method`对象将会有一个`Object[]`类型的数组。 ```java String methodName = "myMethod"; Method method = clazz.getMethod(methodName, argType1, argType2); // 如果方法没有参数则忽略 ``` 3. 检查权限:确保你有执行该方法的权限,使用`canAccess()`或`canExecute()`方法。 ```java if (method.canAccess() && method.isAccessible()) { method.setAccessible(true); // 设置为可访问,即使默认不公开 } ``` 4. 调用方法:现在你可以使用`invoke()`方法来调用这个方法了。传入实际的对象实例和所需的参数。 ```java Object objInstance = new MyClass(); Object result = method.invoke(objInstance, arg1, arg2); ``` 5. 清理(可选):如果你之前设置了方法为可访问,记得在其不再被使用后恢复默认值。 ```java method.setAccessible(false); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值