`

反射机制

    博客分类:
  • Java
 
阅读更多

2016.10.31

 

java反射机制详解:

通俗地讲,反射机制就是把可以把一个类,类的成员(函数、属性),当成一个对象来操作,也就是说,当我们在运行的时候还可以动态去操作他们。

 

下面以一个小列子来说明,因为觉得案列驱动是最好的,如果只看理论的话,可能看不懂。

 

package refect;

public class Tester {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException  {
		//输入	
		System.out.println("请输入你的类:");
		Scanner sc=new Scanner(System.in);
		String str=sc.next();
		while(true){		
				//装载一个类
				Class c=Class.forName(str);
				//获得构造器
				Constructor ct =c.getConstructor();//String是构造函数需要的参数类型
				//根据构造器获得对象						
				Object o=ct.newInstance();//参数是构造方法中要传入的参数	
				System.out.println("请输入方法名:");
				
				String oName=sc.next();//输入对象的名称
				
				System.out.println("请输入参数:");
				
				int canshu =sc.nextInt();//方法的参数			
				//获得方法,前提是获取方法
				Method me=c.getMethod(oName,int.class);	
				
				//在对象上调用方法,第一个参数是对象。第二个参数是对象方法的参数
			    String a=  me.invoke(o,canshu).toString();
				System.out.println("最后的结果是:"+a);			
		}	
	}	
}

    再定义一个学生类如下:

 

    

public class Student{
	public Student(){
		
	}
	public int study(int a){
		System.out.println(a);
		return a;
	}
	
}

   然后运行,结果如下:

 

   

 注意运行的时候得加上包名,但是现在我也还没有懂,还有就是在这个过程中会抛出几个异常

 /** 

     * 为了看清楚Java反射部分代码,所有异常我都最后抛出来给虚拟机处理! 

     * @param args 

     * @throws ClassNotFoundException 

     * @throws InstantiationException 

     * @throws IllegalAccessException 

     * @throws InvocationTargetException  

     * @throws IllegalArgumentException  

     * @throws NoSuchFieldException  

     * @throws SecurityException  

     * @throws NoSuchMethodException  

     */

    以后可能会用到反射机制的地方:

    1.工厂模式:Factory类中用反射的话,就不需要再修改工厂类Factory了。

    2.数据库JDBC中通过Class.forName(Driver).来获取数据库连接驱动

    3.分析类文件:能得到类中的方法等等

    4.访问一些不能访问的变量或属性:破解别人的代码等等。

  • 大小: 14 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics