反射机制是java中非常重要的功能,熟练使用反射功能对实际的开发有很大的帮助。

一,通过反射获取对象实例

使用的对象User

 package whroid.java.reflect;

 public class User {

     public String id;
private String name;
protected int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
} }

通过class.forName() 获取对象,括号中是对象的全称

 public static void main(String[] args) {
try {
Class cls = Class.forName("whroid.java.reflect.User");
User user = (User) cls.newInstance();
user.setAge(2);
user.setId("id is ok ");
user.setName("hi");
System.out.println(user);
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException e) {
e.printStackTrace();
}
}

运行后输出:

User [id=id is ok , name=hi, age=2]

二,通过反射获取对象的属性,以及方法等

使用获取对象的属性

 public static void main(String[] args) {
Class<?> cls;
try {
cls = Class.forName("whroid.java.reflect.User");
Field[] fileds = cls.getDeclaredFields();
for (Field filed : fileds) {
System.out.println(Modifier.toString(filed.getModifiers())
+ " " + filed.getType() + " " + filed.getName());
} } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

运行后输出:

public class java.lang.String id

private class java.lang.String name

protected int age

获取对象方法

 public static void main(String[] args) {
Class<?> cls;
try {
cls = Class.forName("whroid.java.reflect.User");
Method[] methods = cls.getDeclaredMethods();
for (Method method : methods) {
System.out.println(Modifier.toString(method.getModifiers())+" "+method.getReturnType()+" "+method.getName()+"("+method.getParameterTypes()+")");
} } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

运行后返回:

public class java.lang.String toString([Ljava.lang.Class;@4d12ee4f)

public class java.lang.String getName([Ljava.lang.Class;@15dbac11)

public void setName([Ljava.lang.Class;@8fd9b4d)

public class java.lang.String getId([Ljava.lang.Class;@41dee0d7)

public void setAge([Ljava.lang.Class;@f7b650a)

public void setId([Ljava.lang.Class;@6e267b76)

public int getAge([Ljava.lang.Class;@2073b879)

三,通过反射调用对象方法

 public static void main(String[] args) {
Class<?> cls;
try {
cls = Class.forName("whroid.java.reflect.User");
Method method = cls.getDeclaredMethod("setName", String.class);
User user = (User) cls.newInstance();
method.invoke(user, "zhang shan' song");
Method getNameMethod = cls.getDeclaredMethod("getName");
String name = (String) getNameMethod.invoke(user);
System.out.println("name:" + name);
System.out.println("user:" + user); } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

运行后返回:

name:zhang shan' song

user:User [id=null, name=zhang shan' song, age=0]

四,动态代理的使用

接口

 package whroid.java.reflect;

 public interface IPersion {
String getName();
void setName(String name);
}

对象类

 package whroid.java.reflect;

 public class ChinesePeople implements IPerson{

     String name;
@Override
public String getName() {
// TODO Auto-generated method stub
return name;
}
@Override
public void setName(String name) {
// TODO Auto-generated method stub
this.name= name;
System.out.println("设置名称为:"+name);
} @Override
public String toString() {
return "ChinesePeople [name=" + name + "]";
}
}

使用InvocationHandler实现自己的代理类

 package whroid.java.reflect;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; //我的代理类
public class TestInvocationHandler implements InvocationHandler {
Object obj;//代理的对象
public TestInvocationHandler(Object obj) {
this.obj = obj;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//在方法实际方法运行前,我的代理类进行运行前的相应操作
System.out.println("before run:"+method.getName());
//实际运行的方法
Object result = method.invoke(obj, args);
//在方法实际运行后,我的代理类可以进行一些收尾工作
System.out.println("after run:"+method.getName());
return result;
} public static void main(String[] args) {
ChinesePeople people = new ChinesePeople();
//参数传入代理对象的类加载器和其对应的接口,以及传入代理对象的代理类
IPerson pe = (IPerson) Proxy.newProxyInstance(people.getClass()
.getClassLoader(), people.getClass().getInterfaces(),
new TestInvocationHandler(people));
pe.setName("hello");
}
}

运行后返回:

before run:setName

设置名称为:hello

after run:setName

java反射的基本使用的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  4. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  5. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射 之 反射基础

    一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  9. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  10. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

随机推荐

  1. hihoCoder #1165 : 益智游戏 (挑战赛11 B题)

    题意:在一个序列中找到两个数a和b,使得a*b的因子个数最多,输出最多的因子个数. 思路:数据较多,处理会很慢.对序列中每个数字进行质数分解求因子个数,然后按照因子个数降序排列,对前50个因子最多的数 ...

  2. 【Python图像特征的音乐序列生成】图像特征在旋律生成中有什么用

    jishude 首先援引一个资料网页:http://www.cosmosshadow.com/ml/%E5%BA%94%E7%94%A8/2016/03/01/%E9%9F%B3%E4%B9%90%E ...

  3. java面试题(杨晓峰)---第四讲强引用、软引用、弱引用、幻想引用有什么区别?

    在java语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握java对象生命周期和JVM内部相关机制非常有帮助. 今天问题:强引用.软引用.弱引用.幻想引 ...

  4. UVA 11992 Fast Matrix Operations (降维)

    题意:对一个矩阵进行子矩阵操作. 元素最多有1e6个,树套树不好开(我不会),把二维坐标化成一维的,一个子矩阵操作分解成多条线段的操作. 一次操作的复杂度是RlogC,很容易找到极端的数据(OJ上实测 ...

  5. Uva 127 poj 1214 `Accordian'' Patience 纸牌游戏 模拟

    Input Input data to the program specifies the order in which cards are dealt from the pack. The inpu ...

  6. falling object思路总结

    1.用检测的方法把falling object标记为一个类别,然后检测出类别.这种方式不可行的原因:因为falling object可能是任何东西,所以可能是一个路锥,也可能是一个玻璃瓶,还可能是掉下 ...

  7. Kafka 完全分布式集群环境搭建

    思路: 先在主机s1上安装配置,然后远程复制到其它两台主机s2.s3上, 并分别修改配置文件server.properties中的broker.id属性. 1. 搭建前准备 示例共三台主机,主机IP映 ...

  8. 廖老师JavaScript教程高阶函数-sort用法

    先来学习一个新词:高阶函数 高阶函数英文叫Higher-order function.那么什么是高阶函数? JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那 ...

  9. vs2005无法附加到进程 系统找不到文件

    用管理员身份打开vs2005. 注意配置.

  10. 【最大权闭合子图 tarjan】bzoj1565: [NOI2009]植物大战僵尸

    dinic+tarjan板子练手题 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其 中P ...