Java反射深入浅出(一)
在JVM中对一个类实例的创建,有两种方式,一种是编译时,一种是运行时。两种方式在开发过程中都是十分重要的。在Java中无时无刻无处不在的Java对象,实例化的过程也就变得尤为引人瞩目。我们经常用new Object()方法来创建实例,而相反的,反射在这个时候就显得突兀,因为有人就会问,Java对象实例的时候为什么不直接new Object就好了呢?其实是情况所迫,有些时候,我们在编译的时候并不知道要什么对象,这个对象的字节码也不知道存在什么地方?是在硬盘,内存,还是遥远的世界另一端的一台电脑中,所以,我们这个时候就用另外一种婉转地方式去编写。
- 字节码的理解
- Construtor
- Field
- Method
- Array数组和Object的关系
- 创建newInstance对象
String str1 ="abc";
Class cls1 = str1.getClass();
Class cls2 =String.class;
Class cls3 =Class.forName("java.lang.String");
System.out.println(str1.getClass());
System.out.println(cls1 == cls2);
System.out.println(cls3 == cls2);
/**
输出结果
class java.lang.String
true
true
*/
System.out.println(int[].class.isPrimitive());
System.out.println(int[].class.isArray());
//得到全部的构造方法
//constructor
Constructor[] constuctor =Class.forName("java.lang.String").getConstructors();
//得到参数为StringBuffer的构造方法
Constructor constructor =Class.forName("java.lang.String").getConstructor(StringBuffer.class);
public class ReflectPoint{
//private和public的属性
private int x;
public int y;
public ReflectPoint(int x,int y){
super();
this.y = y;
this.x = x;
}
publicString toString(){
System.out.println(str1 + str2 + str3);
return str1 + str2 + str3;
}
}
//Field
ReflectPoint pt1 =newReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");
System.out.println(fieldY.get(pt1));
Field fieldX = pt1.getClass().getDeclaredField("x");
fieldX.setAccessible(true);
System.out.println(fieldX.get(pt1));
/**
结果:
5
3
*/
private static void changeStringValue(Object obj) throws Exception{
// TODO Auto-generated method stub
Field[] fields = obj.getClass().getFields();
for(Field field : fields){
if(field.getType()==String.class){
String oldValue =(String) field.get(obj);
String newValue = oldValue.replace("a","b");
field.set(obj, newValue);
}
}
}
//Method方法
String str1 = "a";
Method methodCharAt =String.class.getMethod("charAt",int.class);
System.out.println(methodCharAt.invoke(str1,1));
//str1是一个String的实例对象
/**
* 数组的反射
* @param o1
*/
private static void printObject(Object o1){
// TODO Auto-generated method stub
Class clazz = o1.getClass();
if(clazz.isArray()){
int length =Array.getLength(o1);
for(int i =0; i < length; i++){
System.out.println(Array.get(o1, i));
}
}else{
System.out.println(o1);
}
} int[] a1 =newint[]{1,2,3};
int[] a2 =newint[4];
int[][] a3 =newint[3][4];
String[] a4 =newString[]{"a","b","c"};
printObject(a1);
printObject(a4);
String obj =(String)Class.forName("java.lang.String").newInstance();
Java反射深入浅出(一)的更多相关文章
- Java反射深入浅出
在JVM中对一个类实例的创建,有两种方式,一种是编译时,一种是运行时.两种方式在开发过程中都是十分重要的.在Java中无时无刻无处不在的Java对象,实例化的过程也就变得尤为引人瞩目.我们经常用new ...
- 深入浅出Java反射
反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息 这里笔者就深入浅出总结下Java反射,若有不 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java反射(基础了解)
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- java反射学习之二万能EXCEL导出
一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
随机推荐
- RestTemplate实践
什么是RestTemplate? RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效 ...
- Webform——中国省市三级联动以及IsPostBack
首先要明白Webform的运行顺序,当开始启动时候,首先执行的是Page_Load事件, 当点击任意按钮后,每次点击都要先执行一遍Page_Load(在这里Page_Load里面的事件是给数据控件加载 ...
- centos下安装mysql遇到的问题
我前边遇到的坎,竟然和这篇百度经验惊人的相似,他帮我大忙了,十分感谢作者啊,连接双手奉上http://jingyan.baidu.com/article/ce436649fec8533773afd38 ...
- Hibernate的一级二级缓存机制配置与测试
特别感谢http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session ...
- form表单提交controller层接收到的值为乱码的问题
今天遇到个中文乱码问题,大体情况是这样的:前台有一个form表单,其中有几个input的控件,值是带中文的,form表单只设置了id='form1' method='post' action='xx ...
- Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...
- FileIOUtils.java
package com.vcredit.ddcash.batch.util; import com.vcredit.ddcash.batch.autoAdvance.AutoAdvanceTask;i ...
- 20145337《Java程序设计》第三周学习总结
20145337 <Java程序设计>第三周学习总结 教材学习内容总结 类与对象 类与对象的关系:要产生对象必须先定义类,类是对象的设计图,对象是类的实例.我觉得在视频中对类与对象关系的描 ...
- 【iCore3 双核心板】例程二十三:LAN_HTTP实验——网页服务器
实验指导书及代码包下载: http://pan.baidu.com/s/1getgyKr iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- ios-改变button四个角的弧度
-(void)createTitleView{ UIView * backview = [[UIView alloc]init]; backview.frame =CGRectMake(87*kHei ...