Java中类的反射机制


反射:
1.获取对应的class对象
方式1:★
Class clazz=Class.forName("全限定名");
方式2:
Class clazz=类名.class;
方式3:
Class clazz==对象.getClass();
2.通过class对象创建一个实例对象(相当于  new 类())
Object clazz.newInstance();
3.通过class对象获取一个方法(public修饰的)
Method method=clazz.getMethod("方法名",Class .... paramType);
paramType为参数的类型
4.让方法执行:
method.invoke(Object 实例对象,Object ... 参数);
Object 实例对象:以前调用方法的对象 就是a
Object ... 参数:该方法运行时需要的参数 就是 10和30
执行这个方法 相当于
a.add(10,30);
例如:
method.invoke(a,10,30)


package com.none;

public class HelloMyServlet {
	public void add() {
		System.out.println("空参的add方法");
	} 
	public void add(int i,int j) {
		System.out.println("带有两个参数的add方法");
		System.out.println(i+j);
	}
	public int add(int i) {
		System.out.println("带有两个参数的add方法");
		return i+10 ;
	}
}




package com.reflect;

import java.lang.reflect.Method;

import org.junit.Test;

import com.none.HelloMyServlet;




public class Demo {
	@Test
	public void f1() {
		// 调用HelloMyServlet()中的方法
		HelloMyServlet hms = new HelloMyServlet() ;
		hms.add();
		hms.add(10,20) ;
	}
	
	@Test
	public void f2() throws Exception {
		// 将指定的类加载到内存之中
		Class clazz = Class.forName("com.none.HelloMyServlet") ;
		
		// 通过字节码创建一个实例对象(相当于调用空参的构造器)
		HelloMyServlet hms = (HelloMyServlet) clazz.newInstance() ;
		// 接着用字节码实例化的对象调用add()方法就可以  hms.add() ;
		
		//获取方法对象
		Method method = clazz.getMethod("add") ;
		
		// 让方法对象执行,obj调用这个方法的实例,args是该方法执行时所需要的参数
		method.invoke(hms) ; // 相当于  a.add() ;
		
	}
	
	@Test
	// 调用有两个参数的add()方法
	public void f4() throws Exception{
		// 获取class对象
		// Class clazz = Class.forName("com.none.HelloMyServlet") ; 
		// 也可以像下面这样
		Class clazz = HelloMyServlet.class ;
		
		// 通过clazz对象创建一个实例化对象
		HelloMyServlet hms = (HelloMyServlet) clazz.newInstance() ;
		
		// 获取两个参数的add方法对象
		Method me = clazz.getMethod("add", int.class,int.class) ;
		
		// 执行方法
		me.invoke(hms, 10,30) ; // 相当于是hms.add(10,30) ;
	}
}


/**
 * 
 * 反射:
 * 
 *  1.获取对应的class对象
 *  方式一★:
 *  		Class clazz = Class.forName("权限定名") ;
 *  方式二:
 *  		Class clazz = 类名.class ;
 *  方式三:
 *  		Class clazz = 对象.getClass() ;
 * 
 * 	2.通过class对象创建一个实例对象 (相当于  new 类() )
 * 		object class.newInstance() ;
 * 	3.通过class 对象获取一个方法执行对象
 * 		Method method = clazz.getMethod("方法名",Class ...paramType) ;
 * 		paramType为参数的类型
 *  4.让方法执行:
 *  	method.invoke(Object 实例对象,Object ... 参数) ;
 *  	Object 实例对象:以前调用方法的对象
 *  	Object ... 参数 :该方法运行时需需要的参数
 *  
 * 		
 * */





你可能感兴趣的:(JavaWeb)