Java学习笔记——反射
反射就是把Java类中的各种成分映射成相应的java类。
Class类-->java程序中的各个java类属于同一事物,描述这类事物的Java类名就是Class。
Class.forName的作用:返回类的字节码,返回的方式有两种,一种是这个类曾被加载过,则直接从JVM中返回字节码,另一种是JVM中没用这个类的字节码,得用类加载器先将字节码加载到JVM中,然后返回字节码。
得到类的字节码的三种方式
1.类名.class
2.对象.getClass();
3.Class.forName("完整类名");例如: Class.forName("java.lang.String");(多用于反射)
public class ReflectTest {
public static void main(String[] args) throws Exception{
String str = "abc";
Class cls1 = str.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
System.out.println(cls1==cls2);//true
System.out.println(cls1==cls3);//true
//判断是否是基本类型
System.out.println(cls1.isPrimitive());//false
System.out.println(int.class.isPrimitive());//true
System.out.println(int[].class.isPrimitive());//false
System.out.println(int.class==Integer.class);//false
System.out.println(int.class==Integer.TYPE);//true
}
}
//用反射实现 new String(new StringBuffer("abc")
Constructor constructor = String.class.getConstructor(StringBuffer.class);
String str1 = (String) constructor.newInstance(new StringBuffer("abc"));
System.out.println(str1);//abc
成员变量的反射(Field类)
//定义一个Point类
public class Point { private int x;
public int y; public Point(int x, int y) {
super();
this.x = x;
this.y = y;
} } 用反射映射Point类 Point p = new Point(3,4);
Field filedY = p.getClass().getField("y");//getField只能得到可见的属性
System.out.println(filedY.get(p));//得到对象p在属性y上的具体值 Field filedX = p.getClass().getDeclaredField("x");//getDeclaredField可以得到私有属性
filedX.setAccessible(true);//暴力反射,将私有的设置为可访问的
System.out.println(filedX.get(p)); 成员变量反射练习
public class Cat { String name = "Happy";
String eyes = "Black";
String eat = "beef";
@Override
public String toString() {
return "Cat [name=" + name + ", eyes=" + eyes + ", eat=" + eat + "]";
} }
public class ReflectTest2 { public static void main(String[] args) throws Exception { Cat cat = new Cat();
System.out.println(cat);//Cat [name=Happy, eyes=Black, eat=beef]
ChangeCat(cat);
System.out.println(cat);//Cat [name=Hbppy, eyes=Blbck, eat=beef] } private static void ChangeCat(Cat obj) throws Exception { Field[] fields = obj.getClass().getDeclaredFields(); for(Field field:fields){
field.setAccessible(true);
if(field.getType()==String.class){
String oldStr = (String) field.get(obj);
String newStr = oldStr.replace('a', 'b');
field.set(obj, newStr);
}
} } }
成员方法反射(Method类)
public class ReflectTest2 {
public static void main(String[] args) throws Exception {
String str1 = "abc";
Method method = Class.forName("java.lang.String").
getMethod("charAt", int.class);
char ch = (char) method.invoke(str1, 1);
System.out.println(method.invoke(str1, 1));//b
System.out.println(method.invoke(str1, new Object[]{2}));//c
}
}
对含有数组参数的成员方法进行反射
//定义一个含有main方法的类
class TestArguments{
public static void main(String[] args){ for(String arg : args){
System.out.println(arg);
}
}
} public class ReflectTest { public static void main(String[] args) throws Exception { /*用反射来实现调用main方法*/
String className = args[0];
Method mainMethod = Class.forName(className).getMethod("main", String[].class);
mainMethod.invoke(null, (Object)new String[]{"111","222","333"});
mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}}); //以上两种调用等价,jdk1.5后,会将数组参数进行拆解,这样上述的一个数组参数就变成了3个参数,则会出现数组个数不匹配,
//故应将数组强制转换成Object或将数组作为一个对象用Object数组进行封装 } }
Java学习笔记——反射的更多相关文章
- Java学习笔记--反射
什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...
- 0034 Java学习笔记-反射-初步2-操作对象
通过反射创建对象 通过反射创建对象有两种方式,一种通过Class对象的newInstance()方法,一种是获取到Class对象的Constructor后,再调用newInstance()方法,前者要 ...
- 0033 Java学习笔记-反射-初步1
先看看通过反射能干嘛 示例:修改对象的private实例变量 package testpack; import java.lang.reflect.Field; public class Test1 ...
- Java学习笔记--反射API
反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换. 按照 一般地面向对象的设计 ...
- Java 学习笔记 反射与迭代器
反射 使用反射获得类 Class cls = Class.forName("全类名") //包括包名 Class cls = xx.Class;//xx代表类名 使用反射获得构造方 ...
- JAVA 学习笔记 - 反射机制
1. JAVA反射机制的概念 2. 怎样实例化一个 Class对象 Class.forName(包名.类名); 对象.getClass(); 类.class; ================== ...
- Java学习笔记-反射机制
Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法 获取Class对象的三种方式 Object类中的getClass()方 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- JAVA学习笔记—review基本知识[反射与异常]
JAVA学习笔记—review基本知识[反射与异常] 1.异常: 1.1异常的分类: Java会将所有的异常封装成对象,其根本父类为Throwable. Throwable有两个子类:Error 和E ...
随机推荐
- jquery源码——noConflict实现
实现方式很简单:在初始化的时候,记录当前全局中jQuery和$两个变量的的值,用_jQuery和_$分别存放,调用noConflict方法时,使用_jQuery和_$分别恢复对应的值,并且返回jQue ...
- POJ 2479 两段连续最大和
题目大意: 在一组数中,找到连续的两段 , 是这两段相加和达到最大 这里利用dp[2][N]的数组保存所有的状态 dp[0][i]表示取到第i个数时只取了一段的最大和,第i个数是一定要被取到的 dp[ ...
- codevs 1378 选课
题目描述 Description 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修 ...
- Codeforces 651D Image Preview【二分+枚举】
题意: 若干张照片,从头开始可以向左右两边读,已经读过的不需要再读,有的照片需要翻转,给定读.滑动和翻转消耗的时间,求在给定时间内最多能读多少页? 分析: 首先明确,只横跨一次,即先一直读一边然后再一 ...
- maven提示“编码 GBK 的不可映射字符”问题的解决
pom.xml中加上如下代码 <properties> <!-- spring版本号 --> <spring.version>4.2.3.RELEASE</s ...
- Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可。
Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可.
- hadoop 文件操作
Create a directory in HDFS - mkdir The hadoop mkdir command is for creating directories in the hdfs. ...
- (linux shell)第一章--小试牛刀(下)
文章来源: (linux shell)第一章--小试牛刀(下) 1.6 数组和关联数组 1.6.1 预备知识 Bash同一时候支持普通数组和关联数组.普通数组仅仅能使用整数作为数组索引,而关联数组能够 ...
- JSP页面怎样导入优酷视频
我在做的一个项目里面,应客户要求.要导入视频.然后我再考虑,视频是直接放在本地数据库的话,那么肯定会出现数据视频读取反应慢. 那么,就能够把视频先传到优酷上面,然后再直接应用优酷视频上的html代码, ...
- PHP中的extract函数的用途 extract($_GET);extract($_POST)
把客户端表单中的变量名取出来 addslashes -- 使用反斜线引用字符串 extract(addslashes($_POST)); --处理POST表单 把客户端<FORM METHOD= ...