java 反射机制

java 反射


  • 反射是一种动态机制,允许我们在代码运行期间来决定
  • 实例化对象,调用方法,操作属性等.
  • 反射可以提高代码的灵活度,但是会降低执行效率.
  • 反射应当在程序中起到"画龙点睛"的作用,而不应当过度依赖反射.

案例需要定义一个类:这里定义了Person类

package reflect;
/**
 *  使用当前类测试反射机制
 * @author 
 *
 */

public class Person {
	public void sayHello() {
		System.out.println("大家好!");
	}
	public void sayHaha(){
		System.out.println("哈哈!");
	}
}
public void say(String name){
		System.out.println("大家好!我是:"+name);
	}
public void say(String name,int age){
		System.out.println("大家好! 我叫"+name+",今年"+age+"岁了");
	}

Demo1 相关方法

/*
		 * Class类  称为:类的类对象
		 * Class类的每一个实例是用于描述JVM已经加载的
		 * 一个类的.并且JVM内部每个加载的类都有且只有
		 * 一个Class实例与之对应.我们通过类对象可以获取
		 * 其表示的类的一切信息(类名,有哪些方法,属性等)
		 * 因此反射离不开这个类.使用反射的第一步就是获取
		 * 一个类的类对象,而获取方式有三种:
		 * 1: 类名.class
		 *     每个类都可以以这种方式获取类对象,此种写法
		 *     简单明了,但是缺点是不灵活.例如:
		 *     Class cls = String.class;   获取String的类对象
		 *     Class cls = int.class;  获取int的类对象
		 *     Class cls = Object.class;  
		 *     
		 * 2:Class.forName(String name)
		 *    Class提供了一个静态方法forName,可以传入要
		 *    加载的类的完全限定名(包名.类名)来获取该类的
		 *    类对象
		 *    Class cls = Class.forName("java.lang.String");
		 *    
		 * 3:类加载器ClassLoader形式   
		 */
		
		//  main 方法做测试
				// 获取Person类的对象
//		Class cls=Person.class;
		
		Class cls=Class.forName("reflect.Person");
		//获取类名
		String name=cls.getName();
		System.out.println(name);
		// 获取该类所有的方法
//		Method[] methods=cls.getMethods();
		// 获取该类自己定义的所有方法
		Method[] methods=cls.getDeclaredMethods();
		for(Method m:methods){
			System.out.println(m.getName());
		
		

demo2 使用Class来快速实例化其表示的类的实例

		Person p=new Person();
		System.out.println(p); // reflect.Person@xxxxx
		
		// 传入(包名.类名)来获取该类对象
		Class cls=Class.forName("reflect.Person");
		/*
		 * Class的这个newInstance()方法只能调用其表示的
		 * 类的无参构造器来实例化对象.如果该类没有则会
		 * 抛出异常
		 */
		Object obj=cls.newInstance();
		System.out.println(obj);  // reflect.Person@xxxx

		// 可见 两个都是Person 对象
	}


demo3 利用反射动态调用方法

Class cls=Class.forName("reflect.Person");
		Object o=cls.newInstance();
		
		//通过class获取要调用的方法
		Method method=cls.getMethod("sayHaha");
		// 调用该方法
		method.invoke(o);
		 

demo4 调用有参方法


	public static void main(String[] args) throws Exception {
		Class cls= Class.forName("reflect.Person");
		Object obj=cls.newInstance();
		// 获取say(String name)方法
		Method method=cls.getMethod("say", String.class);
		method.invoke(obj,"张三");
		
		// say(String name ,int age)
		Method method2 = cls.getMethod("say",String.class,int.class);
		method2.invoke(obj,"李四",22);
		
	}

边长参数特性

	public static void main(String[] args) {
		dosome("a");
		dosome("1","b");
		dosome("a","b","c");
		
	}
	
	public static void dosome(String... str){
		System.out.println(str.length);
	}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值