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;
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;
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());
}
}
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();
} }
}
34男
java.lang.IllegalAccessException:
Class com.test.accessible.Main
can not access
a member of class com.test.accessible.AccessibleTest
with modifiers "private"
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();
}
}
}
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 里内涵最丰富的对象了 ...
随机推荐
- LoadRunner 调用Dll完成加密解密
LoadRunner里的函数比较少,没有MD5.Base64加密. 我们可以通过在C++里把一些加解密写成函数,供LR调用. DLL函数编写 C++里新建工程Class Library(此处是用VS2 ...
- 自己开发轻量级ORM(一)
在开发ORM之前,先简单的介绍下ORM的基本概念. 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的 ...
- 微端游戏启动器launcher的制作(序篇)
公司要做一个游戏接入腾讯QQ游戏大厅,腾讯要求制作一个launcher,公司之前并没有接入过腾讯,所以大家其实都不懂,而我又是新人,所以刚拿到这个任务的时候整个人就是一个大写的懵逼.在网上查找了不少的 ...
- Spark RDD算子介绍
Spark学习笔记总结 01. Spark基础 1. 介绍 Spark可以用于批处理.交互式查询(Spark SQL).实时流处理(Spark Streaming).机器学习(Spark MLlib) ...
- java字节数组格式化为十六进制字符串
/** * 格式化byte * * @param b * @return */ public static String byte2hex(byte[] b) { char[] Digit = { ' ...
- Android注解学习(1)
对于注解这个概念刚开始不是很理解,翻阅了其他人博客,参考实现的例子开始理解与运用.以前刚开始的写android项目时,一般找定义控件并初始化控件都是调用findviewbyId,然而当一个布局页面(类 ...
- 在Angular中,如果权限值是异步请求所得,如何将其设置为HTTP请求头的Authorization?
遇到此问题的背景:项目需要实现单点登录,在前后端分离的前提下,前台如何保存token值成为了一个问题.想到的解决方案是,将token值统一存到一个前端程序,其他的前端程序去这个前端程序去取token( ...
- samba服务搭建
文件传输 smb主配置文件 /etc/samba/smb.conf? yum install samba samba-client 要启动smb和nmb服务 修改安全级别 security = sha ...
- iOS开发之仿射变换示例总结
本篇博客比较简单,但还是比较实用的.其中的示例依然使用Swift3.0来实现,该博客算是下篇博客的一个引子,因为我们下篇博客要介绍使用Swift开发iOS应用中常用的一些Extension.而在这些E ...
- PHP 端口号 是否 被占用 以及 解决方法
开始---->运行---->cmd,或者是window+R组合键,调出命令窗口{PHP详尽配置环境:http://www.cnblogs.com/ordinaryk/p/6496398.h ...