这篇博友的总结的反射知识点是比较全面的

http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

下面介绍我用反射做的两个功能

1、列出被反射类所有的属性和继承自接口或者父类的属性

2、调用反射类的方法

3、通过反射调用被反射类的setter方法

先列出接口类,父类,被反射的类

接口类:

package com.test.reflect.helper;

public interface ChinaInterface {
public static final String name="Rollen";
public static int age=20;
public void sayChina();
public void sayHello(String name, int age);
}

父类

package com.test.reflect.helper;

public class FatcherClass {
public String getBirthday() {
return birthday;
} public void setBirthday(String birthday) {
this.birthday = birthday;
} private String birthday; //private不会继承
public String sex; //public 的属性会被继承
}

反射类

package com.test.reflect.helper;

public class Person extends FatcherClass  implements  ChinaInterface{

	public Person() {

	}

	public Person(String name) {
this.name = name;
} public Person(int age) {
this.age = age;
} public Person(String name, int age) {
this.age = age;
this.name = name;
}
public void setName(String name)
{
this.name=name;
}
public void setAge(int age)
{
this.age=age;
} public String getName() {
return name;
} public int getAge() {
return age;
} @Override
public String toString() {
return "[" + this.name + " " + this.age + "]";
} private String name;
private int age;
@Override
public void sayChina() {
// TODO Auto-generated method stub
System.out.println(" China, hi nice to meet you!"); } @Override
public void sayHello(String name, int age) {
// TODO Auto-generated method stub
System.out.println("hello ,i am "+name+"and i am "+age +"yeas old"); }
}

下面我们实现功能一:列出被反射类所有的属性和继承自接口或者父类的属性

package com.test.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier; public class GetAllFieldsAndInterfaceParentClass { public static void main(String[] args) {
method();
} public static void method() {
Class<?> demo = null;
try {
// 取得object的 实例,不是对象
demo = Class.forName("com.test.reflect.Person");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} System.out.println("-------------获取object所有的属性--------------");
// 获取 所有的声明的字段
Field[] fieldArray = demo.getDeclaredFields(); for (int i = 0; i < fieldArray.length; i++) {
// 获取权限修饰符 返回int类型,再转化为String类型
int mo = fieldArray[i].getModifiers();
String priv = Modifier.toString(mo); // 获取字段的类型
Class<?> type = fieldArray[i].getType();
System.out.println(priv + " " + type.getName() + " "
+ fieldArray[i].getName());
} System.out.println("-------------实现的接口或者父类的属性--------------");
//获取所有父类或继承的接口
Field[] inhertArray=demo.getFields();
System.out.println(inhertArray.length);
for(int j=0;j<inhertArray.length;j++)
{
//获取权限
int mo=inhertArray[j].getModifiers();
String priv=Modifier.toString(mo); //获取接口或类的类型
Class<?> type=inhertArray[j].getType(); System.out.println(priv+" "+type.getName()+" "+inhertArray[j].getName()); }
} }

结果:

-------------获取object所有的属性--------------
private java.lang.String  name
private int  age
-------------实现的接口或者父类的属性--------------
3
public static final java.lang.String  name
public static final int  age
public java.lang.String  sex

实现功能二、调用反射类的方法

package com.test.reflect;

import java.lang.reflect.Method;

public class UseReflectMethod {

	public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("ok");
Class<?> demo = null; try {
demo = Class.forName("com.test.reflect.helper.Person");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} try {
//获取被反射类的方法
Method method = demo.getMethod("sayChina");
//传递类实例,调用对应方法
method.invoke(demo.newInstance()); //获取被反射类的方法,并说明所要传递的参数的类型
Method method2=demo.getMethod("sayHello",String.class,int.class);
//传递参数,并调用方法
method2.invoke(demo.newInstance(), "jack",234); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

结果:

China, hi nice to meet you!
hello ,i am jackand i am 234yeas old

实现功能三:通过反射调用被反射类的setter方法

package com.test.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier; public class UseGetterAndSetter { public static void main(String [] args)
{
Class<?> demo=null; try {
demo=Class.forName("com.test.reflect.helper.Person");
Object obj=demo.newInstance(); Field[] declaredFieldArray=demo.getDeclaredFields(); for(int i=0;i<declaredFieldArray.length;i++)
{
//获取修饰符,访问 权限
int mo=declaredFieldArray[i].getModifiers();
String priv=Modifier.toString(mo);
//获取变量类型
Class<?> type=declaredFieldArray[i].getType();
if(type.getName()=="java.lang.String")
invokeGetAndSet(type,declaredFieldArray[i].getName(),obj,"jackvin");
else if(type.getName()=="int")
invokeGetAndSet(type,declaredFieldArray[i].getName(),obj,23); } /*反射调用setter和getter的一般方法
* Object obj=demo.newInstance();
*Method methodSetName=demo.getMethod("setName",String.class);
*methodSetName.invoke(obj, "jackvin");
*Method methodSetAge=demo.getMethod("setAge", int.class);
*methodSetAge.invoke(obj, 12);
*System.out.println(obj.toString());
*/ System.out.println(obj); } catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} } public static void invokeGetAndSet(Class<?> type,String field,Object obj,String fieldValue)
{ //拼接成setFiled()方法的名字
String methodName="set"+field.substring(0,1).toUpperCase()+field.substring(1);
try { Method method= obj.getClass().getMethod(methodName, type);
method.invoke(obj,fieldValue); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public static void invokeGetAndSet(Class<?> type,String field,Object obj,int fieldValue)
{ //拼接成setFiled()方法的名字
String methodName="set"+field.substring(0,1).toUpperCase()+field.substring(1);
try { Method method= obj.getClass().getMethod(methodName, type);
method.invoke(obj,fieldValue); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

结果:

[jackvin  23]

java反射简单实例的更多相关文章

  1. 主题:Java WebService 简单实例

    链接地址:主题:Java WebService 简单实例    http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...

  2. java反射技术实例

    java反射技术实例​1. [代码][Java]代码     package com.gufengxiachen.java.reflectiontest; public class Person {p ...

  3. java 反射的实例

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

  4. java 反射创建实例与new创建实例的区别

    new创建实例 new创建一个编译时已知的类的实例,也即是静态的创建实例: 可以调用类的任何构造器来创建实例: 速度更快,由于可以将需要的类写入字节文件中(hardcoded into the byt ...

  5. Java反射的实例

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

  6. java中的反射简单实例

    package club.reflection.entity.User; /** * 实体类 * */ public class User { public String name; private ...

  7. Java反射-简单应用

    为了程序更好的维护和扩展,在面向对象思维的世界里,首先是面向接口编程,然后我们应该把做什么和怎么做进行分离. 以下我将用一个开晚会的样例来演示一下,终于达到的效果是:工厂+反射+配置文件实现程序的灵活 ...

  8. Java反射+简单工厂模式总结

    除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...

  9. Java反射简单使用--第一次细致阅读底层代码

    1:所写的东西都经过验证,保证正确,环境jdk8,eclipse2:在例子中,尽量以生产环境中实际代码为例,那种固定值什么的没什么意义 问题: 1:想获取调用方法所需要的参数 2:参数是以json形式 ...

随机推荐

  1. PCB 设计文件中哪些可以不做成元件

    PCB 文件中哪些可以不做成元件 在 PCB 设计时有些元件为了快速,实际并不需要做成元件. 因为做成元件会浪费时间,并且生产时也没有实际的元件. 如下(持续更新): PCB 与 PCB 之前的连接人 ...

  2. [C++ Primer] 第8章: IO库

    IO类 iostream定义了读写流的基本类型 istream, wistream 从流读取数据 ostream, wostream 向流写入数据 iostream, wiostream 读写流 fs ...

  3. vmware克隆linux网络配置

    一.配置Linux网络 在安装Linux的时候,一定要保证你的物理网络的IP是手动设置的,要不然会在Linux设置IP连通网络的时候会报network is unreachable 并且怎么也找不到问 ...

  4. Oracle约束详解

    一 约束的定义 约束是强加在表上的规则或条件.确保数据库满足业务规则.保证数据的完整性.当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作.约束 ...

  5. 02 - Unit06:弹出对话框

    弹出对话框 如何实现弹出 //弹出出对话框 $("#can").load("alert/alert_notebook.html"); //显示背景色 $(&qu ...

  6. java的按值传递与按引用传递

    还是比较混乱 主要看怎么理解了 java没有指针一说是因为jvm将指针给隐藏了起来 说到底还是靠地址 按值传递显然直接将内存空间的内容传递给对方 之后再与传递者无关 引用是在栈空间建一个堆空间对象的映 ...

  7. Docker系列05:docker镜像制作 &Docker file

    1 什么是Dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成映像. dock ...

  8. java高并发总结-常用于面试复习

    定义: 独占锁是一种悲观保守的加锁策略,它避免了读/读冲突,如果某个只读线程获取锁,则其他读线程都只能等待,这种情况下就限制了不必要的并发性,因为读操作并不会影响数据的一致性. 共享锁则是一种乐观锁, ...

  9. Python之单元测试框架unittest

    创建class继承unittest,每一个测试用例是以test开头的函数,先执行setup,然后用例按照字母的顺序执行,然后执行teardown import unittest class demo( ...

  10. 超文本传输协议http详解

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...