Java反射机制使用场景,以及基于javaReflect Java动态代理实现

1.关于自我复习java 反射机制相关知识点,以下是代码目录结构截图



2.由于公司PC环境会自动加密代码,所以只能直接贴代码,不能上传整个项目

package com.lzq.baseInterface;
/**
 * @Function TODO
 * @Version 1.0.0.0
 * @Date 2017年6月13日
 * @Author lzq
 * @Copyright (C) 2017, ShangHai lzqzzuSoft Co .,Ltd  All Rights Reserved.
 */
public interface BaseCRUD {
boolean install(Class<?> domainName,Object parameter);
boolean update(Class<?> domainName,Object parameter);
}


package com.lzq.domain;


/**
 * @Function TODO
 * @Version 1.0.0.0
 * @Date 2017年6月13日
 * @Author lzq
 * @Copyright (C) 2017, ShangHai lzqzzuSoft Co .,Ltd All Rights Reserved.
 */
public class File {
private String fileName;
private String filePath;


public File(String fileName, String filePath) {
super();
this.fileName = fileName;
this.filePath = filePath;
}


@Override
public String toString() {
return "File [fileName=" + fileName + ", filePath=" + filePath + "]";
}


public String getFileName() {
return fileName;
}


public void setFileName(String fileName) {
this.fileName = fileName;
}


public String getFilePath() {
return filePath;
}


public void setFilePath(String filePath) {
this.filePath = filePath;
}


}



package com.lzq.domain;


/**
 * @Function TODO
 * @Version 1.0.0.0
 * @Date 2017年5月23日
 * @Author lzq
 * @Copyright (C) 2017, ShangHai lzqzzuSoft Co .,Ltd All Rights Reserved.
 */
public class User {
private String name;
private String address;


public User() {
super();
// TODO Auto-generated constructor stub
}


public User(String name, String address) {
super();
this.name = name;
this.address = address;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public String getAddress() {
return address;
}


public void setAddress(String address) {
this.address = address;
}


@Override
public String toString() {
return "User [name=" + name + ", address=" + address + "]";
}


public  boolean setValues(String name) {
if (name instanceof String) {
if (name.equals("lzq")) {
return true;
}


} else {
return false;
}
return false;
}
}


package com.lzq.modeImp;


import com.lzq.baseInterface.BaseCRUD;


/**
 * @Function TODO
 * @Version 1.0.0.0
 * @Date 2017年6月13日
 * @Author lzq
 * @Copyright (C) 2017, ShangHai lzqzzuSoft Co .,Ltd  All Rights Reserved.
 */
public class BaseFactory  {

/**

* @Title: getInstance 
* @Description: TODO(基于java Reflect 方式实现dao的动态代理,方便上层业务功能拓展和调用,减少代码冗余) 
* @param className
* @return
*/
public static BaseCRUD getInstance(String className){
BaseCRUD mBaseCRUD =null;
try {
mBaseCRUD = (BaseCRUD)Class.forName(className).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

return mBaseCRUD; 
}
}




package com.lzq.modeImp;


import com.lzq.baseInterface.BaseCRUD;
import com.lzq.domain.File;


/**
 * @Function TODO
 * @Version 1.0.0.0
 * @Date 2017年6月13日
 * @Author lzq
 * @Copyright (C) 2017, ShangHai lzqzzuSoft Co .,Ltd  All Rights Reserved.
 */
public class FileMode implements BaseCRUD {




@Override
public boolean install(Class<?> domainName, Object parameter) {
File mFile = (File)parameter;
System.out.println("FileMode 执行:"+mFile.toString());
return false;
}


@Override
public boolean update(Class<?> domainName, Object parameter) {
return false;
}


}


package com.lzq.modeImp;


import com.lzq.baseInterface.BaseCRUD;
import com.lzq.domain.User;


/**
 * @Function TODO
 * @Version 1.0.0.0
 * @Date 2017年6月13日
 * @Author lzq
 * @Copyright (C) 2017, ShangHai lzqzzuSoft Co .,Ltd  All Rights Reserved.
 */
public class UserMode implements BaseCRUD {


@Override
public boolean install(Class<?> domainName, Object parameter) {
User newUser = (User)parameter;
System.out.println("UserMode 执行:"+newUser.toString());
return false;
}


@Override
public boolean update(Class<?> domainName, Object parameter) {
return false;
}




}



package com.lzq.test;


import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;


import com.lzq.baseInterface.BaseCRUD;
import com.lzq.domain.File;
import com.lzq.domain.User;
import com.lzq.modeImp.BaseFactory;


/**
 * @Function TODO
 * @Version 1.0.0.0
 * @Date 2017年6月13日
 * @Author lzq
 * @Copyright (C) 2017, ShangHai lzqzzuSoft Co .,Ltd All Rights Reserved.
 */
public class ReflectDemo {


public static void main(String[] args) throws Exception {
Class<?> class1 = Class.forName("com.lzq.domain.User");
System.out.println(class1.getName());


ReflectDemo demo = new ReflectDemo();
demo.reflectConstructors(class1);


Field mField = class1.getDeclaredField("name");
System.out.println(mField + "\n");


demo.setNameByReflect(class1,"lzqname");
demo.setValuesByReflect(class1, "lzq");

ArrayList<Integer> list = new ArrayList<Integer>();
Method method = list.getClass().getMethod("add", Object.class);
method.invoke(list, "hellow java Reflect");
System.out.println(list.get(0)+"\n");

String[] arr = new String[]{"a","b","c"};
System.out.println(demo.getStrings(arr,10)[1]);
System.out.println(demo.getStrings(arr,10).length);

BaseCRUD fileMode = BaseFactory.getInstance("com.lzq.modeImp.FileMode");
File newFile = new File("hellowReflectFile ", "C:\\testmode");
fileMode.install(File.class, newFile);


}

/**
* @Title: getStrings 
* @Description: 根据java Reflect 改变数组的大小 
* @param arrTemp
* @param len
* @return
* @throws InstantiationException
* @throws IllegalAccessException
*/
private String[] getStrings(String[] arrTemp , int len) throws InstantiationException, IllegalAccessException{
//arrTemp[0] = "11";
Class<?> arrayClass = arrTemp.getClass().getComponentType();
Object newArray =  Array.newInstance(arrayClass, len);
int newArraLen = Array.getLength(arrTemp);
System.arraycopy(arrTemp, 0, newArray, 0, newArraLen);
return (String[])newArray;
}



/**
* @Title: setValuesByReflect 
* @Description: 通过java Reflect 调用带有返回值的函数 
* @param class1
* @param name
* @return
* @throws Exception
*/
private boolean setValuesByReflect(Class<?> class1,String name) throws Exception{
Method mMethod = class1.getMethod("setValues", String.class);
boolean isResult = (boolean)mMethod.invoke(class1.newInstance(), "lzq");
System.out.println(isResult+"\n");
return isResult;
}


/**
* @Title: setNameByReflect 
* @Description: TODO 利用java Reflect 调用method 进行设置处理
* @param class1
* @param name
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
*/
private void setNameByReflect(Class<?> class1, String name)
throws NoSuchMethodException, SecurityException,
InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
Method setNamMethod = class1.getDeclaredMethod("setName",
new Class[] { String.class });
User mUser = (User) class1.newInstance();
setNamMethod.invoke(mUser, "lzq");
System.out.println(mUser.toString() + "\n");
}


/**
* @Title: reflectConstructors
* @Description: 根据reflect 查看类中所有构造函数,以及参数类型 以此构造对象
* @param class1
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public void reflectConstructors(Class<?> class1)
throws InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
Constructor<?>[] data = class1.getDeclaredConstructors();
System.out.println(data);
int len = data.length;
for (int i = 0; i < len; i++) {
System.out.println(data[i]);
Class<?>[] type = data[i].getParameterTypes();
for (int j = 0; j < type.length; j++) {
if (j == type.length - 1) {
System.out.print(type[j]);
} else {
System.out.print(type[j] + ",");
}
}


}
User mUser = (User) data[1].newInstance("lzq", "sh");
System.out.println(mUser.toString() + "\n");
}


}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值