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反射使用详细例子的更多相关文章

  1. java反射抄的例子

    package com.reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /* * 反射的概念 * ...

  2. java 反射 的详细总结

    1.前言 什么是反射? 引用教科书的解释: 在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的 ...

  3. java反射机制一个例子

    import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try ...

  4. Java反射机制小例子

    package com.wjy.main; import java.io.Console; import java.lang.reflect.Constructor; import java.lang ...

  5. 初识Java反射

    要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念.本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认识过后展开. 反射是Java被视为动态语 ...

  6. 面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用

    原文链接:原文来自公众号:C you again,欢迎关注! 1.问题描述     "如何在Integer类型的ArrayList中同时添加String.Character.Boolean等 ...

  7. 非常好的Java反射例子

    1.Java反射的概念 反射含义:可以获取正在运行的Java对象. 2.Java反射的功能 1)可以判断运行时对象所属的类 2)可以判断运行时对象所具有的成员变量和方法 3)通过反射甚至可以调用到pr ...

  8. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

  9. (转)个例子让你了解Java反射机制

    个例子让你了解Java反射机制   原文地址:http://blog.csdn.net/ljphhj/article/details/12858767 JAVA反射机制:   通俗地说,反射机制就是可 ...

随机推荐

  1. Docker Python 例子

    版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...

  2. 第十三篇Django Logging配置样例

    第十三篇Django Logging配置样例 阅读目录(Content) Django 日志配置模板 官方链接 Django Logging Django 日志配置模板 LOGGING = { 've ...

  3. springboot+thymeleaf项目中使用th:replace访问templates子目录下的模板,会报错找不到模板路径

    解决方法: 先将模板路径放置templates目录下,发现可以访问,说明th:replace是可以用的. 那可能是出现在路径问题上面. 于是我开始调错,改路径. 后来在网上查找资料.说了很多种方法. ...

  4. HTML5 新增元素梳理

    HTML5新增元素如下图: <canvas> 新元素 <canvas> 标签定义图形,比如图表和其他图像,该标签基于javascript的绘图api 新多媒体元素 <au ...

  5. vs使用opencv总提示igdrclneo64.dll异常.exe: 0xC0000005:的解决方法

    最近项目中要使用opencv库,搭建好环境,使用接口的时候,总提示 igdrclneo64.dll报错崩溃,一直怀疑是自己程序的问题,后面经过一系列的查资料才解决 解决办法: 本地环境:vs2015+ ...

  6. python3.7使用etree遇到的问题

    使用python3.6时安装好lxml时按照许多网上的教程来引入会发现etree没被引入进来 解决办法: 一.import lxml.htmletree = lxml.html.etree这样就可以使 ...

  7. 剑指offer题目汇总

    二维数组中的查找 题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中 ...

  8. springmvc的InternalResourceViewResolver自我理解

    原文链接:https://blog.csdn.net/wwzuizz/article/details/78268007 它的作用是在Controller返回的时候进行解析视图 @RequestMapp ...

  9. 七、CI框架之分配变量数组,循环输出

    一.添加并传递变量 二.在View界面输出 输出显示 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  10. (5)opencv的基础操作和矩阵的掩模操作

    不懂的,可以简单,看看这个网址:https://blog.csdn.net/xiongwen_li/article/details/78503491 图片放到了桌面,所以,图片的路径就是桌面了,剩余的 ...