结合demo理解反射:

import java.lang.reflect.*;
/**
* 反射使用
**/
public class ReflectDemo{
public static void main(String[] args){
ReflectDemo demo = new ReflectDemo();
     if(args.length == 0){
         demo.showClassInfo(null);
      }else{
         demo.showClassInfo(args[0]);
      }
demo.getAndSetPrivateFieldValue();
demo.callPrivateMethod();
} private void showClassInfo(String className){
new showReflectionInfo().showClassInfo(className != null && className.length() > 0 ? className : "Test");
} /**
* 利用反射获取并修改私有域的值
**/
private void getAndSetPrivateFieldValue(){
try{
// 利用反射创建实例
Class _testClass = Class.forName("Test");// Class.forName()方法获取Class对象
Object _t = _testClass.newInstance();// 使用Class对象.newInstance()创建对象实例 Field _f = Test.class.getDeclaredField("name");
_f.setAccessible(true);// 设置私有的域可被访问
Object _value = _f.get(_t); // 使用get(Object obj)方法获取私有域的值
System.out.println(_value);// 输出 zhangsan _f.set(_t, "wangwu");// 使用set(Object obj, Object newValue)方法修改私有域的值
_value = _f.get(_t);
System.out.println(_value);// 输出 wangwu
System.out.println();
}catch(Exception e){
e.printStackTrace();
}
} /**
* 利用反射调用其他类的私有方法
**/
private void callPrivateMethod(){
Test _t= new Test(); System.out.println(_t.getName());
//_t.setName("lisi");// setName为Test类的私有方法,外部不可以直接这样调用// 使用反射机制调用Test类的私有方法setName()
Method _m = null;
try{
//
_m = Test.class.getDeclaredMethod("setName", String.class);
/*
方法二:使用反射得到setName()方法
Class _cl = _t.getClass();
Method[] _ms = _cl.getDeclaredMethods();
for(int i=0;i<_ms.length;i++){
if(_ms[i].getName().equals("setName")){
_m = _ms[i];
break;
}
}
*/ _m.setAccessible(true);// 不设置可访问权限,会报错java.lang.IllegalAccessException: Class ReflectDemo can not access a member of class Test with modifiers "private"
_m.invoke(_t, "lisi");// invoke表示调用setName()方法,这里m就是setName()方法
}catch(Exception e){
e.printStackTrace();
}
System.out.println(_t.getName());
}
} class Test{
private String name = "zhangsan";
public String getName(){
return name;
} private void setName(String paramName){
name = paramName;
}
} class showReflectionInfo{ /**
* 利用反射分析类的能力
**/
public void showClassInfo(String paramClassName){
if(paramClassName != null && paramClassName.length() > 0){
try{
StringBuilder _sb = new StringBuilder("");
Class _class = Class.forName(paramClassName);
Class _superClass = _class.getSuperclass(); String _modifier = Modifier.toString(_class.getModifiers());
if(_modifier != null && _modifier.length() > 0){
_sb.append(_modifier.concat(" "));
}
_sb.append("class ".concat(_class.getName()));
if(_superClass != null && _superClass != Object.class){
_sb.append(" extends ".concat(_superClass.getName()));
}
_sb.append(" {\n"); printFields(_sb, _class);
_sb.append("\n");
printConstructors(_sb, _class);
_sb.append("\n");
printMethods(_sb, _class); _sb.append("}\n"); System.out.println(_sb.toString());
}catch(Exception e){
e.printStackTrace();
} }
} /**
* 打印这个类的所有域
**/
private void printFields(StringBuilder paramStringBuilder, Class paramClass){
if(paramStringBuilder == null || paramClass == null){
return;
}
// getDeclaredFields()返回这个类或接口的全部域(含私有域);getFields()返回本类/接口及其所有父类/接口的所有公有域
Field[] _fields = paramClass.getDeclaredFields();
String _modifier = "";
for(Field _f:_fields){
paramStringBuilder.append(" ");
_modifier = Modifier.toString(_f.getModifiers());
if(_modifier != null && _modifier.length() > 0){
paramStringBuilder.append(_modifier.concat(" "));
}
Class _type = _f.getType();
paramStringBuilder.append(_type.getName().concat(" "));
paramStringBuilder.append(_f.getName().concat(";\n"));
}
} /**
* 打印这个类的所有构造方法
**/
private void printConstructors(StringBuilder paramStringBuilder, Class paramClass){
if(paramStringBuilder == null || paramClass == null){
return;
}
// getDeclaredConstructors()返回这个类的全部构造方法(含私有的);getConstructors()返回这个类所有公有构造方法
Constructor[] _constructors = paramClass.getDeclaredConstructors();
String _modifier = "";
for(Constructor _c:_constructors){
paramStringBuilder.append(" ");
_modifier = Modifier.toString(_c.getModifiers());
if(_modifier != null && _modifier.length() > 0){
paramStringBuilder.append(_modifier.concat(" "));
} paramStringBuilder.append(_c.getName().concat("("));
Class[] _paramTypes = _c.getParameterTypes();
int _len = _paramTypes.length;
for(int i = 0;i< _len;i++){
paramStringBuilder.append(_paramTypes[i].getName());
if(i<_len - 1){
paramStringBuilder.append(",");
}
}
paramStringBuilder.append(");\n");
}
} /**
* 打印这个类的所有非构造方法
**/
private void printMethods(StringBuilder paramStringBuilder, Class paramClass){
if(paramStringBuilder == null || paramClass == null){
return;
} // getDeclaredMethods()返回这个类或接口的全部方法(含私有方法);getMethods()返回本类/接口及其所有父类/接口的所有公有方法
Method[] _methods = paramClass.getDeclaredMethods();
String _modifier = "";
for(Method _m:_methods){
paramStringBuilder.append(" ");
// Modifier中静态方法:Modifier.toString()、Modifier.isAbstract()、Modifier.isPublic()、Modifier.isPrivate()...
_modifier = Modifier.toString(_m.getModifiers());
if(_modifier != null && _modifier.length() > 0){
paramStringBuilder.append(_modifier.concat(" "));
}
paramStringBuilder.append(_m.getReturnType().getName().concat(" ").concat(_m.getName()).concat("(")); Class[] _paramTypes = _m.getParameterTypes();
int _len = _paramTypes.length;
for(int i = 0;i< _len;i++){
paramStringBuilder.append(_paramTypes[i].getName());
if(i<_len - 1){
paramStringBuilder.append(",");
}
}
paramStringBuilder.append(");\n");
}
}
}

输出结果如下:

第2个例子:

import java.util.*;
import java.nio.file.*;
import java.nio.charset.*;
import java.io.*;
import java.lang.reflect.*;
/**
* 利用反射机制使用Scanner类中私有构造方法private Scanner(Path source, Charset charset)读取打印文件内容
**/
public class ReflectDemo1{ public static void main(String[] args){
try{ // ###### 获取构造函数Constructor对象 方法一:######
// 注意:使用getDeclaredConstructor()方法获取构造函数时声明处 Class<?> cl 切记一定要加<?>
Class<?> cl = Class.forName("java.util.Scanner"); // 也可以Class<?> cl = Scanner.class;
Constructor cons = cl.getDeclaredConstructor(Path.class,Charset.class); /*
// ###### 获取构造函数Constructor对象 方法二:######
Class cl = Class.forName("java.util.Scanner");
Constructor cons = null; Constructor[] cts = cl.getDeclaredConstructors();
Class[] cls;
for(Constructor ct:cts){
cls = ct.getParameterTypes();
List<String> ll = new ArrayList<String>(cls.length);
for(Class c:cls){
ll.add(c.getName());
} if(ll.contains(Path.class.getName()) && ll.contains(Charset.class.getName()) ){
cons = ct;
break;
}
}
*/ if(cons !=null){
System.out.println("find it");
cons.setAccessible(true);// 因为这个构造方法是私有的,需要设置权限
Scanner scanner = (Scanner) cons.newInstance(Paths.get("ReflectDemo1.java"),Charset.forName("utf-8"));
String str = "";
while((str = scanner.nextLine())!=null){
System.out.println(str);
}
}
}catch(Exception e){
}
}
}

java中反射的使用的更多相关文章

  1. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

  2. java中反射学习整理

    转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序能够訪问.检測和改动它本身的状态或行为的一种能力. jav ...

  3. Java中反射的实现方式

    所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Method)以及调用其中的方法 ...

  4. 简单模拟Java中反射的应用场景

    有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...

  5. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  6. Java中反射与常用方法

    java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理.   如何获得Class ...

  7. Java中反射机制详解

    序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...

  8. java中反射讲解及实例

    Java反射机制详解 java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实 ...

  9. Java中反射的理解

    反射 一.什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态性". 反射用在 Java 身上指的是我们可以于运行时加载.探知.使用编译期间完全未 ...

  10. java中反射

    Person.java===>>person.class ==>>jvm中的类加载器===>>class对象:代表内存中Person.class ==>> ...

随机推荐

  1. 算法:贪心、回溯(su)、分治、动态规划,思想简要

    贪心算法: 只做出当前看来最好的选择,而不从整体考虑最优,他所作出的是局部最优解.使用该算法的前提是必须具备无后效性,即某个状态以前的选择不会影响以后的状态的选择,只与当前状态有关. 回溯算法: 本质 ...

  2. lintcode-80.中位数

    80. 中位数(简单题) 给定一个未排序的整数数组,找到其中位数. 中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数. 样例 给出数组[4, 5, 1, 2, 3], ...

  3. 【python】学习笔记之遇到的坑print输出报错

    在Python3.x中,使用print时出错(SyntaxError: Missing parentheses in call to 'print')解决办法 Python2到Python3,很多基本 ...

  4. rancher2.x的安装

    docker run -d --restart=unless-stopped \-p 80:80 -p 443:443 \-v  /var/lib/rancher:/var/lib/rancher/ ...

  5. 【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业)

    Github项目地址:https://github.com/MokouTyan/suduku_131700101 [2019.09.20]更新:代码经过Code Quality Analysis工具的 ...

  6. Spring Cloud Eureka源码分析 --- client 注册流程

    Eureka Client 是一个Java 客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的.使用轮询负载算法的负载均衡器. 在应用启动后,将会向Eureka Serve ...

  7. 解决vs2010按ctrl+f5,调试窗口一闪而过的方法

    vs2010调试按F5与按Ctrl+F5有什么区别 Ctrl F5测试运行后不自动推出控制台,直接按F5会自动退出去 解决vs2010按ctrl+f5,调试窗口一闪而过的方法 http://hi.ba ...

  8. bean名称相同冲突Annotation-specified bean name 'xx' for bean class [xxx] conflicts with existing, non-compatible bean definition of same name and class[xxx]

    工程中引入其他工程的包,由于两个工程中有重名的两个bean,导致在启动时提示如下错误: 根据bean名称在ide中查找,找到这两个重名的类,可以看到由于这两个类使用@Service标注,此时如果不使用 ...

  9. Windows10环境下 Nginx+ffmpeg自搭服务器制作RTMP直播流

    Windows10环境下 Nginx+ffmpeg自搭服务器制作RTMP直播流学习笔记 所需条件: nginx-rtmp-module(带rtmp模块) ,链接:https://link.jiansh ...

  10. web服务器请求代理方式

    1 通信数据转发程序:代理.网关.隧道 代理:是一种有转发功能的应用程序,他扮演了位于服务器和客户端“中间人”的角色,接收客户端发送的请求并转发给服务器:同时也接收服务器返回的响应并转发给客户端. 使 ...