Java反射(reflection)特点

版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/82869451

*.class文件介绍

学习Java的初学者都知道Java中存在JVM来包装java语言使得java在各种机器上都能很好的运行。一个*.java的文件首先编译成*.class文件,*.class文件是JVM能够识别的文件,最后*.class文件在JVM下编译成机器可以识别的二进制文件。


Class类引入

正是在*.class文件的基础上才引来了reflection机制。java中reflection机制就是供程序员来读取*.class文件中的有用的信息。首先java提供了一个Class(public final class Class<T> //是一个公共常量类)正是利用Class类对象来指定调用的*.class的·文件名进而利用这个Class类对象来操作*.class中的Field、Method、ParameterType等取得各种参数。

以下简述如何利用Class寻找指定Method并调用goalMethod

//创建

  1. Class cls=String.class;
  2. String str="中国你好";    Class cls=str.getClass();
  3.    Class cls=class.forName("Test5.Hello");   //直接查找路径

//列出Method、Field

Method[ ] methods=cls.getMethods( );

Field[ ] fields=cls.getFields( );

for(Method m : methods)

   System.out.println( m.getName( ) );

for(Field f : fields)

   System.out.println( f.getName( ) );

//实例化Class

Object obj=cls.newInstance( );

//利用MethodName、Paramer取得指定Method

String methodName="setIInformation";

Class[ ] parameterType={int.class,String.class};

Method mGoal=cls.getMethod(methodName,parameterType);  //找到指定Method

Object[ ] parameter={123,"shenchong"};   //参数赋值

mGoal.invoke(obj,parameter);  //利用invoke函数调用指定method


实战项目

利用File、properties、Class技术配置控制台login命令响应。

   说明:项目实现在eclipse下的Console窗口下输入login usename=shenchong password=123456实现将usename、password的值传给响应类中的setter中,其中login是程序取得输入的命令。代码和运行结果如下:

//ScShell.java
package Test5;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Properties;

public class ScShell
{
	Properties proper=new Properties();
	private ScShell()
	{
		InputStream is=ScShell.class.getResourceAsStream("/scshell.properties");
		try
		{
			proper.load(is);
			is.close();
			
		} catch (IOException e)
		{
			System.out.println("properties load has problem!");
		}
	}
	
	public static void start() 
	{
		ScShell shell=new ScShell();
		
		System.out.println("------- ScShell Command Ui Framework ------");
		System.out.println("作者: 知飞翀");
		System.out.println("官网: http://biggerchong.cn");
		System.out.println("此演示程序是 Java学习指南(基础篇) 的官网资料,最新版本请到官网下载!");
		System.out.println("\n");
		
		try
		{
			shell.process();
		} catch (IOException e)
		{
		
			System.out.println("process has problem!");
		}
	}
	
	private void process() throws IOException
	{
		InputStreamReader m=new InputStreamReader(System.in);
		BufferedReader reader=new BufferedReader(m);
		
		//读取输入内容
		while(true)
		{
			System.out.print("# ");
			
			String textline=reader.readLine();
			if(textline==null)
				break;
			
			if (textline == "exit")
			{
				System.out.println("good bye!");
				break;
			}
			//去除左右空格
			textline=textline.trim();
			handleCommand(textline);
		}
		reader.close();
	}
	
	private void handleCommand(String text) 
	{
		command cmd=new command();
		cmd.parser(text);
		String en=proper.getProperty(cmd.entrance).trim();
		
		if(en.length()==0)
			System.out.println("getPropwety has problem!");
		try
		{
		
			Class cls=Class.forName(en);
			Object obj=cls.newInstance();
			Method[] methods=cls.getMethods();
			Method method=null;
			for(pair a:cmd.p)
			{
				String key=a.k;
				String value=a.v;
				
				// 标准化setter的名字,例如 username -> setUsername
				char firstChar = Character.toUpperCase(key.charAt(0));
				StringBuffer strbuf = new StringBuffer("set" + key);
				strbuf.setCharAt(3, firstChar);
			
				
				for (Method m : methods)
				{
					if (m.getName().trim().equals(strbuf.toString()))
					{
						method = m;
						break;
					}
				}
				
				if(method==null)
					System.out.println("getMethod has problem!");
				
				Object[] parameter= {value};
				method.invoke(obj, parameter);
			}
			Method execute=cls.getMethod("execute", null);
			Integer returnValue=(Integer)execute.invoke(obj, null);
			System.out.println("------> return value = " + returnValue + " <--------");
		} catch (Exception e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
	//解析器
	private class pair
	{
		String k;
		String v;
		public pair()
		{
			
		}
		
		public pair(String k,String v)
		{
			this.k=k;
			this.v=v;
		}
	}
	
	private class command
	{
		String entrance=new String();
		ArrayList<pair> p=new ArrayList<pair>();
		
		public void parser(String textline)
		{
			String[] buf=textline.split(" ");
			this.entrance=buf[0].trim();
			
			p.clear();
			for(int i=1;i<buf.length;i++)
			{
				String[] aim=buf[i].trim().split("=");
				if(aim.length!=2)
					System.out.println("数据输入错误!");
				String k=aim[0].trim();
				String v=aim[1].trim();
				p.add(new pair(k,v));
			}
		}
	}
	
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		ScShell.start();
		
	}

	
}


//Scshell.properties

login=Test5.MyTest



//MyTest.java
package Test5;

public class MyTest
{
	String usename;
	String password;
	public void setUsename(String usename)
	{
		this.usename = usename;
	}
	public void setPassword(String password)
	{
		this.password = password;
	}
	public int execute()
	{
		if(this.usename.equals("shenchong")&&this.password.equals("123456"))
			System.out.println("登陆成功!");
		else
			System.out.println("登陆失败!");
		return 0;
	}
	
	
}

运行结果如下:

谢谢观看!如有不对请评论哟! 

猜你喜欢

转载自blog.csdn.net/biggerchong/article/details/82869451