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反射机制: 通俗地说,反射机制就是可 ...
随机推荐
- 常见的四种Essay Reference写作格式大全
Essay包括四个部分——introduction,Main body,conclusion,Reference. 1.Introduction包括Topic的背景介绍和文章主要解决的主要问题,一般是 ...
- vzray服务端配置
打开securecrt登陆服务器 输入命令:bash <(curl -s -L https://git.io/vzray.sh)1 回车tcp 回车端口 回车默认 回车
- sourcetree安装以及跳过sourcetree注册登录 - git仓库管理工具桌面版
腾讯软件下载:https://pc.qq.com/detail/17/detail_23237.html 官网下载:https://www.sourcetreeapp.com/ 下载完直接安装 ...
- 小程序实现textarea行数自动增加
查找网上案例很多,但是都不是很满意,参考大牛案例终结了一下,话不多说代码如下: 实现效果: 前段代码 <view class="text-box"> <view& ...
- 二十四、CI框架之URL辅助函数
一.控制器代码如下: 二.view的显示代码中,关于路径,我们可以用另外一种方法来写, 如: "/CodeIgniter-3.1.10/index.php/welcome/add" ...
- java集合对象区别一
Vector和ArrayList 1.vector是线程同步的,所以他也是线程安全的,而ArrayList是线程异步的,是不安全的.如果不考虑到线程的安全因素,一般用ArrayList效率较高. 2. ...
- 不使用.h .lib文件使用DLL内的函数
#include <windows.h> typedef int (*Func)(const char *fmt, ...); //这里声明一个函数指针,typedef 关键字是必须的,好 ...
- nginx重写常用写法
1.将http协议重写成https协议: (用户用http进行访问,但后端是https),则可添加80 http端口监听,然后进行https rewrite; server { listen ...
- JFrame的面板结构和JPanel的使用
JFrame图解结构 有一窗口框架实例:JFrame win = new JFrame("窗口");在new JFrame()时,构建了JFrame实例对象,在实例中的Layere ...
- NSDictionary和NSMaptable, NSArray,NSSet,NSOrderedSet和NSHashTable的区别
NSSet, NSDictionary, NSArray是Foundation框架关于集合操作的常用类, 和其他标准的集合操作库不同, 他们的实现方法对开发者进行隐藏, 只允许开发者写一些简单的代码, ...