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. 常见的四种Essay Reference写作格式大全

    Essay包括四个部分——introduction,Main body,conclusion,Reference. 1.Introduction包括Topic的背景介绍和文章主要解决的主要问题,一般是 ...

  2. vzray服务端配置

    打开securecrt登陆服务器 输入命令:bash <(curl -s -L https://git.io/vzray.sh)1 回车tcp 回车端口 回车默认 回车

  3. sourcetree安装以及跳过sourcetree注册登录 - git仓库管理工具桌面版

      腾讯软件下载:https://pc.qq.com/detail/17/detail_23237.html 官网下载:https://www.sourcetreeapp.com/   下载完直接安装 ...

  4. 小程序实现textarea行数自动增加

    查找网上案例很多,但是都不是很满意,参考大牛案例终结了一下,话不多说代码如下: 实现效果: 前段代码 <view class="text-box"> <view& ...

  5. 二十四、CI框架之URL辅助函数

    一.控制器代码如下: 二.view的显示代码中,关于路径,我们可以用另外一种方法来写, 如: "/CodeIgniter-3.1.10/index.php/welcome/add" ...

  6. java集合对象区别一

    Vector和ArrayList 1.vector是线程同步的,所以他也是线程安全的,而ArrayList是线程异步的,是不安全的.如果不考虑到线程的安全因素,一般用ArrayList效率较高. 2. ...

  7. 不使用.h .lib文件使用DLL内的函数

    #include <windows.h> typedef int (*Func)(const char *fmt, ...); //这里声明一个函数指针,typedef 关键字是必须的,好 ...

  8. nginx重写常用写法

    1.将http协议重写成https协议: (用户用http进行访问,但后端是https),则可添加80 http端口监听,然后进行https rewrite; server {     listen ...

  9. JFrame的面板结构和JPanel的使用

    JFrame图解结构 有一窗口框架实例:JFrame win = new JFrame("窗口");在new JFrame()时,构建了JFrame实例对象,在实例中的Layere ...

  10. NSDictionary和NSMaptable, NSArray,NSSet,NSOrderedSet和NSHashTable的区别

    NSSet, NSDictionary, NSArray是Foundation框架关于集合操作的常用类, 和其他标准的集合操作库不同, 他们的实现方法对开发者进行隐藏, 只允许开发者写一些简单的代码, ...