java反射使用详细例子
1. 概念
反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。
2. 反射机制的作用
通过反机制访问java类的属性,方法,构造方法等;
3.反射机制中的类
(1) java.lang.Class; 类的对象代表一个类的所有
(2) java.lang.reflect.Constructor; 类的对象代表构造函数
(3) java.reflect.Filed; 类的对象代表属性
(4) java.lang.Method; 类的对象代表方法
(5) java.lang.Modifier; 类的对象代表修饰符
例1:获取Class的三种方式
/*
获取Class的三种方式
*/
import java.util.Date;
class ReflectTest01
{
public static void main(String[] args) throws Exception
{
/*获取ReflectTest01test类*/
//第一种方式
//c1引用保存内存地址只想堆中的对象,该对象代表的时ReflectTest01test整个类
Class c1= Class.forName("ReflectTest01test");
//第二种方式
//java种每个类型都有clas属性
Class c2 = ReflectTest01test.class;
//第三种方式
//java语言种任何一个java对象都有getclass方法
ReflectTest01test e = new ReflectTest01test();//e的运行时类时ReflectTest01test
Class c3 = e.getClass();//c3时运行时类 System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
/*获取java.util.Date类*/
Class c4 = Class.forName("java.util.Date");//必须写类全名
Class c5 = Date.class; Date d = new Date();
Class c6 = d.getClass(); System.out.println(c4);
System.out.println(c5);
System.out.println(c6); }
}
例2:通过class对象创建java对象
/*
获取class类型的对象之后,可以创建该类的对象
*/
import java.util.*;
import java.text.*;
class ReflectTest03
{
public static void main(String[] args) throws Exception
{
Class c = Class.forName("ReflectTest01test");
//创建此类Class对象所表示的类的一个新实例
Object o = c.newInstance();//ReflectTest01test类的无参数构造方法(此方法调用了无参数构造方法) System.out.println(o);// ReflectTest01test@15db9742 //获得系统当前时间
Class c1 = Class.forName("java.util.Date");
Object o1 = c1.newInstance();
if(o1 instanceof Date){
Date t = (Date)o1;
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(t));
}
}
} /*
ReflectTest01test类的无参数构造方法
ReflectTest01test@15db9742
2017-05-22 15:34:12 059
请按任意键继续. . .
*/
例3:IO+Properties
/*
IO+Properties
配置文件(属性文件通常以.Properties结束)test:(内容:username=zhangsan)
将配置文件中的中文转换成Unicode码方法:
命令行输入:
1. native2ascii 回车
2. 输入中文
3.将转换成的Unicode码复制到配置文件相应的位置
李四 */
import java.io.*;
import java.util.*;
class ReflectTest04
{
public static void main(String[] args) throws Exception
{
//创建属性对象
Properties p = new Properties();//同map,单Key和Value只能是字符串,Key不能重复,如果重复则Value覆盖
//创建输入流
FileInputStream fis =new FileInputStream("test.Properties");
//将fis流中的所有数据加载到属性对象中
p.load(fis);
fis.close();
String v = p.getProperty("username");
System.out.println(v);
}
}
例4:反射机制+IO+Properties+reflect动态创建java对象
/*
配置文件test1.Properties中的内容:className = java.util.Date
*/
import java.io.*;
import java.util.*;
class ReflectTest05
{
public static void main(String[] args) throws Exception
{
//1.创建属性对象
Properties p = new Properties(); //2.创建流
FileInputStream fr = new FileInputStream("test1.Properties");
//加载
p.load(fr);
//通过key获取value
String className = p.getProperty("className");
System.out.println(className);
//通过反射机制创建对象
Class c = Class.forName(className);
Object o = c.newInstance();
System.out.println(o);
}
}
/*
java.util.Date
Mon May 22 18:05:19 CST 2017
请按任意键继续. . . */
例5:反编译类的所有Field
1.测试类
class User
{
private String id;
public int age;
protected String addr;
boolean sex; }
2.java.lang.reflect.Filed类中的属性
/*
java.lang.reflect.Filed类中的属性
*/
import java.lang.reflect.*;
class ReflectTest06
{
public static void main(String[] args) throws Exception
{
//获取整个类
Class c = Class.forName("User");
//获取属性Filed
//获取所有public修饰的属性
Field [] fs = c.getFields();
System.out.println(fs.length);
System.out.println(fs[0].getName());
System.out.println(".............................");
//获取所有的属性
Field [] fs1 = c.getDeclaredFields();
for(Field field:fs1){
//getModifiers作为整数返回由此 Member 所表示的成员或构造方法的
//Java 语言修饰符。应该使用 Modifier 类解码整数中的修饰符
int i = field.getModifiers();
System.out.println(i);
System.out.println(".............................");
String strmodifiers = Modifier.toString(i);
System.out.println(strmodifiers);
System.out.println(".............................");
Class type = field.getType();
System.out.println(type.getName());//获取类型的第一种方式
System.out.println(type.getSimpleName());//获取类型的第二种方式
System.out.println(field.getName());
}
System.out.println("............................."); //获取整个类 StringBuffer sb = new StringBuffer();
sb.append(Modifier.toString(c.getModifiers())+"class"+" "+c.getSimpleName()+"{\n");
for(Field field:fs1){
sb.append("\t");
sb.append(Modifier.toString(field.getModifiers())+" ");
sb.append(field.getType().getSimpleName()+" ");
sb.append(field.getName()+";\n");
}
sb.append("}");
System.out.println(sb); }
}
2.运行结果:
1
age
.............................
2
.............................
private
.............................
java.lang.String
String
id
1
.............................
public
.............................
int
int
age
4
.............................
protected
.............................
java.lang.String
String
addr
0
............................. .............................
boolean
boolean
sex
.............................
class User{
private String id;
public int age;
protected String addr;
boolean sex;
}
请按任意键继续. . .
例6:反射某类具体某个Field
/*
java.lang.reflect.Field获取某个特定的属性
*/
import java.lang.reflect.*;
class ReflectTest07
{
public static void main(String[] args) throws Exception
{
//获取类
Class c = Class.forName("User");
//获取id属性
Field idf = c.getDeclaredField("id");
//获取某个特定的属性可以用来代替set..,get..
Object o = c.newInstance();
//打破封装,导致java属性不安全
idf.setAccessible(true);
idf.set(o,"001");
System.out.println(idf.get(o));//
}
}
例7:反编译某个类所有Method
1.测试类
class Test2
{
public boolean login(String name,String pwd){
if("z".equals(name)&&"123".equals(pwd)){
return true;
}
return false;
} public void logout(){
System.out.println("已退出");
} }
2. java.reflect.Method;
/*
java.reflect.Method;
*/
import java.lang.reflect.*;
class ReflectTest08
{
public static void main(String[] args) throws Exception
{
//获取类
Class c = Class.forName("Test2");
//获取所有的方法
Method[] ms = c.getDeclaredMethods();//返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法
for(Method m : ms){
System.out.println(Modifier.toString(m.getModifiers()));//Modifier对类和成员访问修饰符进行解码
//方法的返回值类型
Class returnType = m.getReturnType(); System.out.println(returnType.getSimpleName());//得到类型的简写名称
//方法名
System.out.println(m.getName());
//方法的形参列表
Class [] ParameterType = m.getParameterTypes();//getParameterTypes()按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。
for(Class ParmeterType:ParameterType )
System.out.println(ParmeterType.getSimpleName());
}
System.out.println("..............反编译.............");
//反编译
StringBuffer sb = new StringBuffer();
sb.append(Modifier.toString(c.getModifiers())+"class");
sb.append(c.getSimpleName()+"{\n");
for(Method m:ms){
sb.append("\t");
sb.append(Modifier.toString(m.getModifiers())+" ");
sb.append(m.getReturnType().getSimpleName()+" ");
sb.append(m.getName()+"(");
//形参
Class [] parameterTypes = m.getParameterTypes();
for(int i = 0;i<parameterTypes.length;i++){
Class parameterType = parameterTypes[i];
if(i==parameterTypes.length-1){
sb.append(parameterType.getSimpleName());
}else{
sb.append(parameterType.getSimpleName()+",");
}
}
sb.append("){}\n"); }
sb.append("}\n"); System.out.println(sb);
}
}
运行结果:
public
void
logout
public
boolean
login
String
String
..............反编译.............
classTest2{
public void logout(){}
public boolean login(String,String){}
} 请按任意键继续. . .
例8.反编译某个类具体的Method
/*
java.lang.reflect
*/
import java.lang.reflect.*;
class ReflectTest09
{
public static void main(String[] args) throws Exception
{
//获取类
Class c = Class.forName("Test2");
//获取某个特定的方法,通过方法名加形参列表
Method m = c.getDeclaredMethod("login",String.class,String.class);
//通过反射机制执行login方法
Object o = c.newInstance();
//调用o对象的m方法,传递两个参数将结果存放在reValue中
Object reValue = m.invoke(o,"z","123");
System.out.println(reValue);
}
}
例9.获取所有的构造方法
/*
获取构造方法
*/
import java.lang.reflect.*;
class ReflectTest10
{
public static void main(String[] args) throws Exception
{
Class c = Class.forName("Test2");
//获取所有的构造方法
Constructor[] cs = c.getDeclaredConstructors();
for(Constructor con : cs){
//获取修饰符
System.out.println(Modifier.toString(con.getModifiers()));
//获取构造方法名
System.out.println(c.getName());
//构造方法的形式参数列表
Class [] parameterTypes = con.getParameterTypes();
for(Class parameterTyppe :parameterTypes){
System.out.println(parameterTyppe.getSimpleName());
}
}
//反编译
StringBuffer sb = new StringBuffer();
sb.append(Modifier.toString(c.getModifiers())+"class"+c.getSimpleName()+"{\n");
//构造方法
for(Constructor con:cs){
sb.append("\t");
sb.append(Modifier.toString(con.getModifiers())+" ");
sb.append(c.getSimpleName()+"(");
//形参
Class [] parameterTypes = con.getParameterTypes();
for(int i=0;i<parameterTypes.length;i++){
Class parameterType = parameterTypes[i];
if(i==parameterTypes.length-1){
sb.append(parameterType.getSimpleName());
}
else{
sb.append(parameterType.getSimpleName()+",");
}
}
sb.append("){}\n");
}
sb.append("}");
System.out.println(sb);
}
}
/*
public
Test2
classTest2{
public Test2(){}
}
请按任意键继续. . .
*/
例10.获取某个类的某个构造方法
/*
反射某个类某个构造方法,创建对象
*/
import java.lang.reflect.*;
class ReflectTest11
{
public static void main(String[] args) throws Exception
{
//获取类
Class c = Class.forName("Customer");
//获取特定的构造方法
Constructor con = c.getDeclaredConstructor(String.class,int.class);
//创建对象
Object o = con.newInstance("zhangsan",90);
System.out.println(o);
}
}
class Customer
{
String name;
int age;
Customer(String name,int age){
this.name = name;
this.age=age;
}
public String toString(){
return "Customer["+name+","+age+"]";
} }
/*
Customer[zhangsan,90]
请按任意键继续. . .
*/
例11.获取父类和父接口
/*
类获取父类和父接口
*/ class ReflectTest12
{
public static void main(String[] args) throws Exception
{
Class c = Class.forName("java.lang.String");
//获取父类
Class superclass = c.getSuperclass();
System.out.println(superclass.getName());
//获取父接口(多个)
Class [] ins = c.getInterfaces();
for(Class in :ins){
System.out.println(in.getName());
}
}
/*
java.lang.Object
java.io.Serializable
java.lang.Comparable
java.lang.CharSequence
请按任意键继续. . . */
。
java反射使用详细例子的更多相关文章
- java反射抄的例子
package com.reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /* * 反射的概念 * ...
- java 反射 的详细总结
1.前言 什么是反射? 引用教科书的解释: 在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的 ...
- java反射机制一个例子
import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try ...
- Java反射机制小例子
package com.wjy.main; import java.io.Console; import java.lang.reflect.Constructor; import java.lang ...
- 初识Java反射
要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念.本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认识过后展开. 反射是Java被视为动态语 ...
- 面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用
原文链接:原文来自公众号:C you again,欢迎关注! 1.问题描述 "如何在Integer类型的ArrayList中同时添加String.Character.Boolean等 ...
- 非常好的Java反射例子
1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反射甚至可以调用到pr ...
- Java 序列化Serializable详解(附详细例子)
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...
- (转)个例子让你了解Java反射机制
个例子让你了解Java反射机制 原文地址:http://blog.csdn.net/ljphhj/article/details/12858767 JAVA反射机制: 通俗地说,反射机制就是可 ...
随机推荐
- vue学习(十一)vue-cli3开发单文件组件
一 单文件组件介绍 二 如何安装Vue-Cli3脚手架 三 快速原型开发 四 vue-cli3生成项目 五 购物车项目搭建 六 购物车项目操作 七 Mock模拟数据 八 Vue中使用第三方组件(ele ...
- 每天一点点之vue框架开发 - vue组件之间传值(父向子传值)
路由文件 { path: '/productListBase', name: 'productListLink', component: ProductListBase, redirect: '/pr ...
- POJ 1320:Street Numbers
Street Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2753 Accepted: 1530 De ...
- yarn storm spark
单机zookeeper http://coolxing.iteye.com/blog/1871009 storm http://os.51cto.com/art/201309/411003_2.htm ...
- 使用Redux管理React数据流要点浅析
在图中,使用Redux管理React数据流的过程如图所示,Store作为唯一的state树,管理所有组件的state.组件所有的行为通过Actions来触发,然后Action更新Store中的stat ...
- JSTL与EL表达式(为空判断)
JSTL与EL表达式(为空判断) 一.循环遍历集合 1.在jsp中引入标准函数声明 <%@ taglib uri="http://java.sun.com/jsp/jstl/cor ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring Bean的配置及常用属性
作为 Spring 核心机制的依赖注入,改变了传统的编程习惯,对组件的实例化不再由应用程序完成,转而交由 Spring 容器完成,在需要时注入应用程序中,从而对组件之间依赖关系进行了解耦.这一切都离不 ...
- c++ 模板联系4
//定义类成员函数特化类型 #include "stdafx.h" #include <iostream> using namespace std; typedef f ...
- python3+Opencv 搭建环境和基本操作
一.必备前提: Python3.5及以上版本.pip.windows环境 二.搭建opencv 该部分可以创建隔绝的Python环境来引入,参照virtualenv的使用 在目标的cmd窗口,依次输入 ...
- Thread--CountDownLatch & CyclicBarrier
参考:http://www.importnew.com/21889.html CountDownLatch countDown() 方法执行完只是计数器减一, 并不会阻塞当前运行线程的的后续代码执行. ...