Java中反射与常用方法
java通常是先有类再有对象,有对象我就可以调用方法或者属性。
- package Reflect;
- /**
- * 通过一个对象获得完整的包名和类名
- * */
- class Demo{
- //other codes...
- }
- class hello{
- public static void main(String[] args) {
- Demo demo=new Demo();
- System.out.println(demo.getClass().getName());
- }
- }
- package Reflect;
- package Reflect;
- class Demo{
- //other codes...
- }
- class hello{
- public static void main(String[] args) {
- Class<?> demo1=null;
- Class<?> demo2=null;
- Class<?> demo3=null;
- try{
- //一般尽量采用这种形式
- demo1=Class.forName("Reflect.Demo");
- }catch(Exception e){
- e.printStackTrace();
- }
- demo2=new Demo().getClass();
- demo3=Demo.class;
- System.out.println("类名称 "+demo1.getName());
- System.out.println("类名称 "+demo2.getName());
- System.out.println("类名称 "+demo3.getName());
- }
- }
- package Reflect;
- package reflect;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- import org.omg.CORBA.PUBLIC_MEMBER;
- /**
- * 五个函数:(public static void)
- * ClassUtil.printClassMessage(Object obj);
- * ClassUtil.printFieldMessage(Object obj);
- * ClassUtil.printConstructorMessage(Object obj);
- * ClassUtil.printInterfacesMessage(Object obj);
- * ClassUtil.printSuperclassMessage(Object obj);
- *
- * @author sargeles
- */
- public class ClassUtil {
- /**
- * 打印类的信息,包括五个函数。
- *
- * @param obj
- *
- */
- public static void printClassMessage(Object obj) {
- // 要获取类的信息,首先要获取类的类类型
- Class c = obj.getClass();// 传递的是哪个子类的对象,c就是该子类的类类型
- // 获取类的名称
- System.out.println("类的名称是:" + c.getName());
- System.out.println("类的成员方法有:");
- /*
- * Method类,方法对象 一个成员方法就是一个Method对象
- * getMethods()方法获取的是所有的public的方法,包括从父类继承而来的
- * getDeclareMethods()获取的是所有该类自己声明的方法,不问访问权限
- */
- Method[] ms = c.getMethods();
- for (Method m : ms) {
- // public int getModifiers()方法是公有的,可以获取修饰符信息,将其包装成一个int。
- int mo = m.getModifiers();
- // Modifier封装了解读带有修饰符信息的int的方法。这些方法都是静态的。可以直接用。
- System.out.print(Modifier.toString(mo) + " ");
- // 得到方法返回值类型的类类型
- Class returnType = m.getReturnType();
- System.out.print(returnType.getName() + " ");
- // 得到方法的名称
- System.out.print(m.getName() + "(");
- // 获取参数类型--->得到的是参数列表的类型的类类型
- Class[] paramTypes = m.getParameterTypes();
- for (int i = 0; i < paramTypes.length; i++) {
- if (i > 0)
- System.out.print(",");
- System.out.print(paramTypes[i].getName());
- }
- System.out.println(")");
- }
- }
- /**
- * 获取成员变量的信息(自己声明的)
- *
- * @param obj
- */
- public static void printFieldMessage(Object obj) {
- // 要获取类的信息,首先要获取类的类类型
- Class c = obj.getClass();// 传递的是哪个子类的对象,c就是该子类的类类型
- System.out.println("类的名称是:" + c.getName());
- System.out.println("类的成员变量有:");
- /*
- * 成员变量也是对象 java.lang.reflect.Field Field类封装了关于成员变量的操作
- * getFields()方法获取的是所有public的成员变量的信息
- * getDeclaredFields()获取的是该类自己声明的成员变量的信息
- */
- Field[] fs = c.getDeclaredFields();
- for (Field field : fs) {
- // 获得成员变量的类型的类类型
- Class fieldType = field.getType();
- String typeName = fieldType.getName();
- // 得到成员变量的名字
- String fieldName = field.getName();
- System.out.println(typeName + " " + fieldName);
- }
- }
- /**
- * 获取类的构造函数信息
- *
- * @param obj
- */
- public static void printConstructorMessage(Object obj) {
- Class c = obj.getClass();
- System.out.println("类的名称是:" + c.getName());
- System.out.println("类的构造函数有:");
- /*
- * 构造函数也是对象 java.lang.Constructor中封装了构造函数的信息
- * getConstructors获取所有的public的构造函数 getDeclaredConstructors得到所有的构造函数
- */
- Constructor[] cs = c.getDeclaredConstructors();
- for (Constructor constructor : cs) {
- // java.lang.Class.getModifiers()方法是公有本地的,可以获取修饰符信息,将其包装成一个int。
- int mo = constructor.getModifiers();
- // Modifier封装了解读带有修饰符信息的int的方法。这些方法都是静态的。可以直接用。
- System.out.print(Modifier.toString(mo) + " ");
- System.out.print(constructor.getName() + "(");
- // 获取构造函数的参数列表--->得到的是参数列表的类类型
- Class[] paramTypes = constructor.getParameterTypes();
- for (int i = 0; i < paramTypes.length; i++) {
- if (i > 0)
- System.out.print(",");
- System.out.print(paramTypes[i].getName());
- }
- System.out.println(")");
- }
- }
- /**
- * 类的接口信息
- *
- * @param obj
- */
- public static void printInterfacesMessage(Object obj) {
- Class c = obj.getClass();
- System.out.println("类的名称是:" + c.getName());
- System.out.println("类实现的接口有:");
- /*
- * 接口类也是对象,因为接口也是类类型的一种,所以是Class的泛型。
- */
- Class[] intes = c.getInterfaces();
- for (Class classes : intes) {
- // 获取每个接口的名字,然后输出。
- System.out.println(classes.getName());
- }
- }
- /**
- * 类的父类信息
- *
- * @param obj
- */
- public static void printSuperclassMessage(Object obj) {
- Class c = obj.getClass();
- System.out.println("类的名称是:" + c.getName());
- System.out.print("类的父类是:");
- /*
- * 父类只可能有一个,所以不用遍历,单根继承。
- */
- Class superclass = c.getSuperclass();
- System.out.println(superclass.getName());
- }
- }
- package reflect;
- public class InvokeDemo {
- private String st="invoke";
- int[] i={1,5,6,9,8,2};
- public void add1(int a, int b) {
- System.out.println(a + b);
- }
- public static void add2(int a, int b) {
- System.out.println(a + b);
- }
- }
- public class InvokeTest {
- public static void main(String[] args) {
- try {
- //获取测试样例的类类型和测试实例
- Class<?> c = Class.forName("reflect.InvokeDemo");
- Object obj = c.newInstance();
- //反射调用
- Method m = c.getMethod("add1",int.class,int.class);
- int[] i={1,2};
- m.invoke(obj,i[1],i[0]);
- //没有必要通过反射调用的static方法
- InvokeDemo.add2(1, 3);
- //反射修改属性
- Field field = c.getDeclaredField("st")
- //使得这个属性可以被修改,无论它是否是私有,甚至final。
- field.setAccessible(true);
- field.set(obj, "男");
- System.out.println(field.get(obj));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
3
4
男
- java.lang.IllegalAccessException:
- Class com.test.accessible.Main
- can not access
- a member of class com.test.accessible.AccessibleTest
- with modifiers "private"
- java.lang.IllegalAccessException:
- public class InvokeTest2 {
- public static void main(String[] args) {
- String str = "I'm not changed!";
- change(str);
- System.out.println(str);
- }
- static void change(String str){
- try {
- Class<?> clazz = str.getClass();
- Field field = clazz.getDeclaredField("value");
- field.setAccessible(true);
- Object obj = field.get(str);
- char[] charValue = (char [] )obj;
- charValue = new char [str.length()];
- String st = "I'm changed!";
- charValue = st.toCharArray();
- field.set(str, charValue);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- public class InvokeTest2 {
Java中反射与常用方法的更多相关文章
- java中String的常用方法
java中String的常用方法1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len= ...
- Java中反射的三种常用方式
Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...
- java中反射学习整理
转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序能够訪问.检測和改动它本身的状态或行为的一种能力. jav ...
- Java中反射的实现方式
所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Method)以及调用其中的方法 ...
- Java中String的常用方法总结
Java中String的常用方法总结 1.length()字符串的长度 String str="HelloWord"; System.out.println(str.length( ...
- 简单模拟Java中反射的应用场景
有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- Java中反射机制详解
序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...
- Java 中 String 的常用方法(一)
上一篇介绍了 String 中的几个常用构造方法,由 String 这个核心对象发散出去关于字符的编码,字符的字节表达,对 GC 的影响,正则表达式,模式匹配,这可能是 Java 里内涵最丰富的对象了 ...
随机推荐
- 《JAVASCRIPT高级程序设计》Ajax与Comet
Ajax,是Asynchronous JavaScript + XML的简写,这一技术能向服务器请求额外的技术而无需卸载页面,会带给用户更好的体验.Ajax的核心是XMLHttpRequest对象.为 ...
- [html5] 学习笔记-html5音频视频
HTML5 最大的新特色之一就是支持音频和视频.在 HTML5 之前,我们必须使用插件如 Silverlight 或 Flash 来实现这些功能.在 HTML5 中,可以直接使用新标签< au ...
- 【翻译】理解Joomla!模板
最近在摸索Joomla的模板开发,看文档的时候心血来潮就干脆把这篇翻译过来,第一次翻译技术文档,肯定有很多错误,希望大家多多批评指正. 原文地址:https://docs.joomla.org/Und ...
- Python dir()/help()
dir() dir()用来查询一个类或者对象所有属性.你可以尝试一下 print dir(list) 返回的结果: ['__add__', '__class__', '__contains__', ' ...
- 理解InnoDB的事务隔离级别
隔离是ACID(Atomicity,Consistency,Isolation,Durability)的重要部分,它保证事务以一种可靠的方式运行.隔离确保同时运行的事务并不相互干扰.隔离确保数据一致性 ...
- 【转】解决UpdatePanel 与 jQuery的冲突
现在越来越多的朋友喜欢将jQuery和ASP.NET AJAX 一起来用,最近,许多印度人在forum里抱怨说UpdatePanel和jQuery不兼容,许多jQuery效果在UpdatePanel更 ...
- Java回调机制解读
模块间调用 在一个应用系统中,无论使用何种语言开发,必然存在模块之间的调用,调用的方式分为几种: (1)同步调用 同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等 ...
- Ionicons的使用
安装 参考Ionicons npm install react-native-vector-icons --save 这时候可能会报错:npm WARN deprcated lodash@4.2.0: ...
- 地图定位CoreLocation框架,地理位置编码与反编码
在现代互联网时代,越来越多的应用,都用到了地图定位功能,在iOS开发中,想要加入这种功能,必须基于两个框架进行开发: 1.Map Kit:用于显示地图, 2.CoreLocation:用于显示地理位置 ...
- js中盒子模型常用的属性你还记得几个?
//clientWidth;//内容宽度Width+左右填充padding//clientHeight;//内容高度height+上下填充padding//clientLeft;//左边框的宽度相当于 ...