JAVA中通过反射可以动态调用一个JAR中的类的方法,构造函数,设置属性。反射最大的好处就是可以动态调取其他类中的信息。下面我们看看反射的具体用法
先创建一个类和接口
package com.springdemo.aopdeom;
public interface IPhone {
//打电话
public void Phone();
public void SendMsg(String content);
public String DownApp(String name,float price);
}
package com.springdemo.aopdeom;
public class ApplePhone implements IPhone {
public String version;
/**
*
*/
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public ApplePhone()
{
System.out.println("调用无参构造函数");
}
public ApplePhone(String type)
{
System.out.println("调用有参构造函数,型号 "+type);
}
public void Phone() {
// TODO Auto-generated method stub
System.out.println("苹果手机打电话");
}
public void SendMsg(String content) {
System.out.println("发送信息"+content);
}
public String DownApp(String name, float price) {
// TODO Auto-generated method stub
System.out.println("下载"+name+",价格:"+price);
return "下载成功";
}
}
1.获取接口
使用Class.forName获取类对象,使用newInstance获取类实例
try {
Class<?> c=Class.forName("com.springdemo.aopdeom.ApplePhone");
ApplePhone p=(ApplePhone)c.newInstance();
//输出类名称
System.out.println("类名"+c.getName());
//获取所有接口
Class<?>[] faces=c.getInterfaces();
for(Class f:faces)
{
System.out.println("接口"+f.getName());
}
System.out.println("获取所有方法-------------------");
2.调用方法
getMethods获取的是所有的方法,包括原生方法
getDeclaredMethods获取的是是定义的方法。不包括原生方法
Method[] methods=c.getMethods();
for(Method m:methods)
{
System.out.println("方法名称"+m.getName());
}
System.out.println("获取所有声明方法-------------------");
//获取声明所有方法
Method[] declareMethods=c.getDeclaredMethods();
for(Method m:declareMethods)
{
System.out.println("方法名称"+m.getName()+",访问权限:"+Modifier.toString(m.getModifiers()));
if(m.getName().equals("Phone"))
{
m.invoke(p);
}
if(m.getName().equals("SendMsg"))
{
m.invoke(p,"你还,欢迎使用反射调用方法");
}
if(m.getName().equals("DownApp"))
{
Object o=m.invoke(p,"疯狂魔兽",10);
System.out.println(o.toString());
}
}
3.构造函数
System.out.println("获取构造函数-------------------");
Constructor<?>[] constructors=c.getConstructors();
for(Constructor co:constructors)
{
System.out.println(co.getParameterCount());
if(co.getParameterCount()==0)
{
ApplePhone co1=(ApplePhone)co.newInstance();
}
if(co.getParameterCount()==1)
{
ApplePhone co1=(ApplePhone)co.newInstance("6");
}
}
4.获取字段
getFields获取的是所有的字段,不包括private定义的
getDeclaredFields获取的是所有字段,默认情况下,私有定义的字段是不可以动态修改的,需要使用f.setAccessible设置可访问性为true
System.out.println("获取所有字段-------------------");
Field[] fs=c.getDeclaredFields();
for(Field f:fs)
{
System.out.println(""+f);
if(f.getName().equals("version"))
{
f.set(p, "6");
System.out.println(f.get(p));
}
if(f.getName().equals("color"))
{
f.setAccessible(true);
f.set(p, "白色");
System.out.println(f.get(p));
}
}
5.属性
System.out.println("属性操作-------------------");
try {
setMethod(p,"Color",String.class,"红色");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Object colorName=null;
try {
colorName = getMethod(p,"Color");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
public static Object getMethod(Object obj,String MethodName) throws Exception{
Method method = obj.getClass().getMethod("get"+MethodName);
return method.invoke(obj);
}
public static void setMethod(Object obj,String MethodName,Class<?> type,Object value) throws Exception{
Method method = obj.getClass().getMethod("set"+MethodName, type);
method.invoke(obj, value);
}