JAVA反射

   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);
    	    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值