话不多说直接上代码

接口:

package bean;

/**
* user接口
*/
public interface User { public String getName(); public void setName(String name); }

父类:

package bean;

/**
* 人 作为userImpl的父类
*/
public class Person {
private String name; public String city; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} @Override
public String toString() {
return "Person [name=" + name + ", city=" + city + "]";
} }

实现类:

package bean;

/**
* 用户实现类
* 当前类没有实现user中的方法,由父类中实现。
*/
public class UserImpl extends Person implements User{ /**
* 用户名
*/
private String userName; /**
* 密码
*/
private String Password; /**
* 是否富有
*/
boolean isRich; /**
* 年龄
*/
protected int age; /**
* 信息
*/
public StringBuffer info; public UserImpl() {
super();
} public UserImpl(String userName) {
super();
this.userName = userName;
} @Override
public String toString() {
return "UserImpl [userName=" + userName + ", Password=" + Password
+ ", isRich=" + isRich + ", age=" + age + ", info=" + info
+ "]";
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassword() {
return Password;
} public void setPassword(String password) {
Password = password;
} public boolean isRich() {
return isRich;
} public void setRich(boolean isRich) {
this.isRich = isRich;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public StringBuffer getInfo() {
return info;
} public void setInfo(StringBuffer info) {
this.info = info;
}
}

工厂接口:

package bean;

public interface Factory {

	<T> T getBean(String name, Class<T> requiredType) throws Exception;
}

工厂:

package bean;

public class FactoryImpl  implements Factory{

	/**
* 获取实例
* @param class1
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
@Override
public <T> T getBean(String name, Class<T> requiredType) throws Exception {
Object object = null;
try {
Class<?> clazz = Class.forName(name);
object = clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//如果obj是这个类的一个实例此方法返回true。
if (requiredType != null && !requiredType.isInstance(object)) {
throw new Exception("类不同,抛异常");
}
return (T)object;
} }

测试类:

package bean;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List; import org.junit.Test; public class ReflectTest { private String className = "bean.UserImpl"; /**
* 获取实例化Class类对象
*/
@Test
public void test01() throws ClassNotFoundException { Class<?> class1 = null;
Class<?> class2 = null;
Class<?> class3 = null; // 第一种方式:
class1 = Class.forName(className);// 一般采用这种形式
// 第二种方式:java中每个类型都有class 属性.
class2 = UserImpl.class;
// 第三种方式: java语言中任何一个java对象都有getClass 方法
class3 = new UserImpl().getClass(); System.out.println("类名称 " + class1.getName());
System.out.println("类名称 " + class2.getName());
System.out.println("类名称 " + class3.getName()); //?号的用法。
//T就是将类型固定,而?则不固定
//List<?> userList = new ArrayList<>();
} /**
* 获取类以后我们来创建它的对象
*/
@Test
public void test02() throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class<?> clazz = Class.forName(className); // 创建此Class 对象所表示的类的一个新实例
Object object = clazz.newInstance(); // 调用无参数构造方法. System.out.println(clazz);
System.out.println(object);
} /**
* 获取对象继承的父类以及实现接口
* @throws ClassNotFoundException
*/
@Test
public void test03() throws ClassNotFoundException { Class<?> clazz = Class.forName(className); // 直接父类
Class<?> superclass = clazz.getSuperclass();
System.out.println("clazz的直接父类为:" + superclass.getName());//calzz的父类为:bean.Person // 所有的接口
Class<?>[] interfaces = clazz.getInterfaces();
System.out.println("clazz实现的接口有:");
for (int i = 0; i < interfaces.length; i++) {
System.out.println((i + 1) + ":" + interfaces[i].getName());
}
// clazz实现的接口有:
// 1:bean.User } /**
* 获取某个类的全部属性
* @throws ClassNotFoundException
*/
@Test
public void test04() throws ClassNotFoundException {
Class<?> clazz = Class.forName(className); System.out.println("=============== 当前类属性 field ==============="); // 取得本类的全部属性
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields) {
// 权限修饰符
int modifiers = field.getModifiers();
String priv = Modifier.toString(modifiers);
// 属性类型
Class<?> type = field.getType();
System.out.println(priv + " " + type.getName() + " " + field.getName() + ";");
} System.out.println("=============== 实现的接口或者父类的属性 field ==========");
System.out.println("=============== 当前类及其父类或接口的public类型属性 =========="); // 取得实现的接口或者父类的属性
Field[] fields = clazz.getFields();
for (Field field : fields) {
// 权限修饰符
int modifiers = field.getModifiers();
String priv = Modifier.toString(modifiers);
// 属性类型
Class<?> type = field.getType();
System.out.println(priv + " " + type.getName() + " " + field.getName() + ";");
} } /**
* 获取某个类的全部方法
* @throws ClassNotFoundException
*/
@Test
public void test05() throws ClassNotFoundException { Class<?> clazz = Class.forName(className); System.out.println("=============== 当前类能调用的所有方法 ==============="); Method[] methods = clazz.getMethods();
for (Method method : methods) {
Class<?> returnType = method.getReturnType();
Class<?>[] parameterTypes = method.getParameterTypes();
Class<?>[] exceptionTypes = method.getExceptionTypes();
int modifiers = method.getModifiers();
String priv = Modifier.toString(modifiers); StringBuffer content = new StringBuffer();
content.append(priv + " " + returnType.getName() + " " + method.getName() + "( ");
//方法参数类型集合
if (null != parameterTypes && parameterTypes.length > 0) {
for (Class<?> parameterType : parameterTypes) {
content.append(parameterType.getName() + " " + ",");
}
content.delete(content.length() - 1, content.length());
}
content.append(" )");
// 方法抛出的异常
if (null != exceptionTypes && exceptionTypes.length > 0) {
content.append(" throws ");
for (Class<?> exceptionType : exceptionTypes) {
content.append(exceptionType.getName() + " " + ",");
}
content.delete(content.length() - 1, content.length());
}
System.out.println(content);
}
} /**
* 通过反射机制调用某个类的方法
* @throws SecurityException
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws InvocationTargetException
* @throws IllegalArgumentException
*/
@Test
public void test06() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class<?> clazz = Class.forName(className); System.out.println("=============== Java 反射机制 - 调用某个类的方法toString ===============");
Object obj = clazz.newInstance(); //调用userImpl的setUserName方法。前提:实例
Method method = clazz.getMethod("setUserName",String.class);
Object result = method.invoke(obj,"张三");
System.out.println("Java 反射机制 - 调用某个类的方法setUserName:" + result); //调用userImpl的toString方法。前提:实例
Method method2 = clazz.getMethod("toString");
Object result2 = method2.invoke(obj);
System.out.println("Java 反射机制 - 调用某个类的方法toString:" + result2);
} /**
* 通过反射机制操作某个类的属性
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SecurityException
* @throws NoSuchFieldException
*/
@Test
public void test07() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
Class<?> clazz = Class.forName(className); System.out.println("=============== Java 反射机制 - 操作某个类的属性 ===============");
Object obj = clazz.newInstance();
Field declaredField = clazz.getDeclaredField("userName");
// 可以直接对 private 的属性赋值
//java.lang.IllegalAccessException: Class bean.ReflectTest can not access a member of class bean.UserImpl with modifiers "private"
declaredField.setAccessible(true);
declaredField.set(obj, "Java反射机制");
System.out.println(declaredField.get(obj));
System.out.println(obj);
} /**
* 获取构造函数
*/
@Test
public void test08() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<?> clazz = Class.forName(className); System.out.println("=============== Java 反射机制 - 获取构造函数 ==============="); Constructor<?>[] constructors = clazz.getConstructors();
if(null != constructors && constructors.length >0){
for (Constructor<?> constructor : constructors) {
System.out.println("构造方法: "+ constructor);
}
Object user1 = constructors[0].newInstance();
Object user2 = constructors[1].newInstance("用户名啊");
System.out.println(user1);
System.out.println(user2);
} } /**
* 调用set和get方法
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
@Test
public void test09() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> clazz = Class.forName(className); System.out.println("=============== Java 反射机制 - 调用set和get方法 ===============");
Object obj = clazz.newInstance();
setter(obj, "userName", String.class, "名字呢");
System.out.println("set后的对象:"+obj); Object result = getter(obj, "userName");
System.out.println("get得到的内容:" + result); } /**
* 通过反射取得并修改数组的信息
*/
@Test
public void test10() {
int[] temps = { 1, 2, 3, 4, 5 };
System.out.println("=============== Java 反射机制 - 取得并修改数组的信息 ==============="); // 获得数组内部类型
Class<?> componentType = temps.getClass().getComponentType(); System.out.println("数组类型: " + componentType.getName());
System.out.println("数组长度: " + Array.getLength(temps));
System.out.println("数组的第一个元素: " + Array.get(temps, 0));
Array.set(temps, 0, 100);
System.out.println("修改之后数组第一个元素为: " + Array.get(temps, 0));
} /**
* 通过反射机制修改数组的大小
*/
@Test
public void test11() {
System.out.println("=============== Java 反射机制 - 修改数组的大小 ==============="); int[] temps = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] newTemps = (int[]) modifyArrayLength(temps, 15);
printArray(newTemps); String[] atr = { "a", "b", "c" };
String[] str1 = (String[]) modifyArrayLength(atr, 8);
printArray(str1);
} /**
* 在泛型为Integer的ArrayList中存放一个String类型的对象。
* @throws SecurityException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
@Test
public void test12() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { System.out.println("=============== Java 反射机制 - 在泛型为Integer的ArrayList中存放一个String类型的对象。==============="); List<Integer> list = new ArrayList<Integer>();
@SuppressWarnings("rawtypes")
Class<? extends List> class1 = list.getClass();
Method method = class1.getMethod("add", Object.class);
method.invoke(list, "这是:String类型的对象");
System.out.println(list); } /**
* 将反射机制应用于工厂模式
* 模仿一下spring
* @throws Exception
*/
@Test
public void test13() throws Exception {
System.out.println("=============== Java 反射机制 - 将反射机制应用于工厂模式 ===============");
FactoryImpl factory = new FactoryImpl();
UserImpl user = factory.getBean(className,UserImpl.class);
System.out.println(user);
} /**
* 反射机制的动态代理
*/
@Test
public void test14() {
System.out.println("=============== Java 反射机制 - 反射机制的动态代理===============");
MyInvocationHandler demo = new MyInvocationHandler();
UserImpl userImpl = new UserImpl();
User user = (User) demo.bind(userImpl);
user.setName("Rollen");
System.out.println(user);
} /**
* 内部类
* 实现调用处理接口
* @author chenchuan
*
*/
class MyInvocationHandler implements InvocationHandler {
private Object obj = null;
public Object bind(Object obj) {
this.obj = obj;
ClassLoader classLoader = obj.getClass().getClassLoader();
Class<?>[] interfaces = obj.getClass().getInterfaces();//目标类的父类及即接口,可以发现执行目标方法时,先执行父类或接口对应的方法
return Proxy.newProxyInstance(classLoader,interfaces , this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("目标方法(" + method +")开始前...");
Object temp = method.invoke(this.obj, args);
System.out.println("目标方法(" + method+")结束后...");
return temp;
}
} /**
* 打印
* @param obj
*/
public static void printArray(Object obj) {
Class<?> c = obj.getClass();
if (!c.isArray()) {
return;
}
System.out.println("数组长度为: " + Array.getLength(obj));
for (int i = 0; i < Array.getLength(obj); i++) {
System.out.print(Array.get(obj, i) + " ");
}
System.out.println();
} /**
* 修改数组大小
* @param obj
* @param newLength
* @return
*/
public Object modifyArrayLength(Object obj, int newLength) {
Class<?> componentType = obj.getClass().getComponentType();
Object newArray = Array.newInstance(componentType, newLength);
int co = Array.getLength(obj);
System.arraycopy(obj, 0, newArray, 0, co);
return newArray;
} /**
*
* 执行get方法
* @param obj 操作的对象
* @param fieldName操作的属性
*/
public Object getter(Object obj, String fieldName) { StringBuffer methodName = new StringBuffer();
methodName.append("get");
// sb.append(fieldName.substring(0, 1).toUpperCase());
// sb.append(fieldName.substring(1));
methodName.append(getMethodName(fieldName)); Object invoke = null;
try {
Method method = obj.getClass().getMethod(methodName.toString());
invoke = method.invoke(obj, new Object[0]);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return invoke;
} /**
* @param obj
* 操作的对象
* @param fieldName
* 操作的属性
* @param type
* 参数的属性
* @param value
* 设置的值
* */
public void setter(Object obj, String fieldName, Class<?> type, Object... value) { StringBuffer methodName = new StringBuffer();
methodName.append("set");
// sb.append(fieldName.substring(0, 1).toUpperCase());
// sb.append(fieldName.substring(1));
methodName.append(getMethodName(fieldName)); try {
Method method = obj.getClass().getMethod(methodName.toString(), type);
method.invoke(obj, value);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} /**
* 把一个字符串的第一个字母大写、效率是最高的、
* @param fildeName
* @return
*/
private String getMethodName(String fildeName) {
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
} }

  

java_反射_及其简单应用(2016-11-16)的更多相关文章

  1. 【转载】webstorm11(注册,激活,破解,码,一起支持正版,最新可用)(2016.11.16更新)

    很多人都发现 http://idea.lanyus.com/ 不能激活了 很多帖子说的 http://15.idea.lanyus.com/ 之类都用不了了 最近封的厉害仅作测试 选择 License ...

  2. Java_反射_范型

    虽然从来没有被面过,但是必须知道,因为classForname classloader被面过多次了. 一.Class.forName动态加载  1.编译时加载类是静态加载类,             ...

  3. 2016/11/16 周三 <使用LocalStore记住用户密码方法示例>

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. 2016/11/16 周三 <Web SQL Database基本使用方法(入门) >

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 最新的 cocoapods 安装与使用(2016.11)

    cocoapods简介: cocoapods 是iOS的类库管理工具,可以让开发者很方便集成各种第三方库,而不用去网站上一个个下载,再一个个文件夹的拖进项目中,还得添加相关的系统依赖库.只需要安装好c ...

  6. C#利用反射+特性实现简单的实体映射数据库操作类

    附上源代码: using System; using System.Collections.Generic; using System.Data; using System.Linq; using S ...

  7. 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理

    2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...

  8. U3D笔记11:47 2016/11/30-15:15 2016/12/19

    11:47 2016/11/30Before you can load a level you have to add it to the list of levels used in the gam ...

  9. 微信iphone7、 ios10播放视频解决方案 2016.11.10

    2016.11.10日更新以下方法 微信最新出同层播放规范 即使是官方的也无法解决所有android手机的问题. 另外iphone 5 .5s 某些手机始终会弹出播放,请继续采用 “以下是老的解决办法 ...

随机推荐

  1. selenium webdriver(3)---操作页面对象

    页面对象的相关操作可以通过接口文件org.openqa.selenium.WebElement查看,本文只是对象接口的使用方式,具体的实现方式在org.openqa.selenium.remote.R ...

  2. Web---JS-返回上一页并刷新代码整理

    返回上一页并刷新在此功能有利于用户的体验,是每一个web开发人员所必备的一项,长话短说,今天介绍实现此功能的一个方法,需要了解的朋友可以参考下: 一:JS 重载页面,本地刷新,返回上一页 代码如下: ...

  3. bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5354  Solved: 2196[Submit][Sta ...

  4. 让你的Git水平更上一层楼的10个小贴士

    注意:本文中,一些命令包含含有方括号的部分(e.g.git add -p [file_name]).在这些例子中,您要在该处插入所需的数字,标示符等.而不需要保留方括号. 1.Git自动补全 如果你在 ...

  5. 问题-[Delphi]断点后怎么设置条件

    1.设置一个断点(这时某行代码有个红点).2.在红点上右击->"Breakpoint properties..."->"Condition:"-&g ...

  6. 字符串hash函数

    本文搜集了一些字符串的常用hash函数. 范例1:判断两个单词是否含有相同的字母,此时我们可以用hash做.例如,“aaabb”与"aabb"含有相同的单词.(参考:http:// ...

  7. MFC中树控件CTreeCtrl的用法

    树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点.MFC中使用CTreeCtrl类来封装树形控件的各种操作.通过调用 BOOL ...

  8. Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效

    Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...

  9. ASP.NET- 播放视频代码

    在网上找的,还不错,支持很多格式.只需要在页面放个lable,建一个放视频文件的文件夹movie,加入代码: protected void Page_Load(object sender, Event ...

  10. NIO机制总结

    Selector selector = Selector.open(); 普通的IO流的读取,写入都是一个字节一个字节或一个字符一个字符的循环进行,在这个过程中,程序是阻塞的,inputStream虽 ...