*.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
//创建
- Class cls=String.class;
- String str="中国你好"; Class cls=str.getClass();
- 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;
}
}
运行结果如下:
谢谢观看!如有不对请评论哟!