(一) 得到字节码的三种方式
//第一种方式:
//得到Ref的字节码
Class bytecodesRef = Ref.class;
//取得Ref字节码对应的构造方法
Constructor constructorRef = bytecodesRef.getConstructor(String.class, Company.class);
//构造这个对象
Ref ref = (Ref) constructorRef.newInstance(new String("apq"), new Company());
//第二种方式:
Class bytecodesRef = Class.forName("com.apq.reflect.Ref");
//第三种方式:
Class bytecodesRef = new com.apq.reflect.Ref(new String("apq"), new Company()).getClass();
(二) 通过反射取得成员变量值
//取得公有成员字段
Field publicFieldX = ref.getClass().getField("x");
System.out.println(publicFieldX.get(ref)); //'public field'
//取得私有成员字段
Field privateFieldY = ref.getClass().getDeclaredField("y");
privateFieldY.setAccessible(true);
System.out.println(privateFieldY.get(ref)); //'private field'
成员变量反射练习:
getFields(ref);
//[x=public field_0, y=private field_1]
System.out.println(ref.toString());
//取得所有成员变量名字和值
public static void getFields(Ref ref) throws Exception {
Field[] fields = ref.getClass().getDeclaredFields();
for(int i = 0, len = fields.length; i < len; i++) {
Field field = fields[i];
field.setAccessible(true);
//取得成员变量名字
String fieldName = field.getName();
String fieldValue = "";
if(field.getType() == String.class) {
//取得成员变量值
fieldValue = (String) field.get(ref);
//设置成员变量值
field.set(ref, fieldValue + "_" + i);
}
}
}
(三)成员方法的反射
//一般调用
String str = "abc";
System.out.println(str.charAt(1)); //b
//反射调用
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str, 1)); //b
//一般调用: Ref.staticMethodPrintCompanyName(new Company());
//反射调用
Method staticMethodPrintCompanyName = Ref.class.getMethod("printCompanyName", Company.class);
//静态方法,invoke第一个参数设置成null
staticMethodPrintCompanyName.invoke(null, new Company()); //xyz
//一般调用: new Ref.methodPrint(new Company());
//反射调用
Ref ref = (Ref) Class.forName("com.apq.reflect.Ref").newInstance();
Method methodPrint = Ref.class.getMethod("print", Company.class);
//非静态方法,invoke第一个参数要传个对象过去
methodPrint.invoke(ref, new Company()); //xyz
//jdk1.4语法
methodPrint.invoke(ref, new Object[] {new Company()}); //xyz
//对接收数组成员方法的进行反射
Method arrMethod = Class.forName("com.apq.test.arrayReflect").getMethod("print", String[].class);
arrMethod.invoke(null, new Object[] {new String[] {"x", "y", "z"}}); //xyz
//or
//arrMethod.invoke(null, (Object) new String[] {"x", "y", "z"}); //xyz
class arrayReflect{
public static void print(String[] args) {
for(int i = 0, len = args.length; i < len; i++) {
System.out.print(args[i]);
}
}
}
(四) 数组的反射
String[] arr = new String[] {"a", "b", "c"};
printObj(arr);
private static void printObj(Object obj) {
Class clazz = obj.getClass();
if(clazz.isArray()) {
int len = Array.getLength(obj);
for(int i = 0; i < len; i++) {
System.out.println(Array.get(obj, i));
}
}else {
System.out.println(obj);
}
}
(五) 通过类加载器读取配置文件
'config.properties'文件内容
className=java.util.ArrayList
Properties props = new Properties();
//config.properties要和Test.java放在一个包下面
//InputStream is = Test.class.getResourceAsStream("config.properties");
//放到src目录下,在eclipse
InputStream is = Test.class.getClassLoader().getResourceAsStream("config.properties");
props.load(is);
String className = props.getProperty("className");
is.close();
List list = (List) Class.forName(className).newInstance();
list.add("a");
System.out.println(list); //[a]
(六) BeanUtils工具包使用
RefPoint rp = new RefPoint(10, 20);
//get一个属性
System.out.println(BeanUtils.getProperty(rp, "x")); //10
//set一个属性
BeanUtils.setProperty(rp, "x", "50");
System.out.println(rp.getX()); //50
BeanUtils.setProperty(rp, "birthday.time", "1980");
System.out.println(BeanUtils.getProperty(rp, "birthday.time"));
//RefPoint类里要new个Company出来
BeanUtils.setProperty(rp, "company.name", "apq company");
System.out.println(BeanUtils.getProperty(rp, "company.name"));
//可以对Map set和get
Map map = new HashMap();
BeanUtils.setProperty(map, "name", "baby69yy2000");
System.out.println(BeanUtils.getProperty(map, "name")); //baby69yy2000
(七) PropertyUtils
Product product = new Product(); //产品
Vendor vendor = new Vendor(); //产品的供应商
PropertyUtils.setProperty(vendor, "name", "Intel");
PropertyUtils.setProperty(product, "name", "E2160");
PropertyUtils.setProperty(product, "quantity", 30);
PropertyUtils.setProperty(product, "vendor", vendor);
System.out.println(PropertyUtils.getProperty(product, "name"));//E2160
System.out.println(PropertyUtils.getProperty(product, "quantity"));//30
vendor = (Vendor) PropertyUtils.getProperty(product, "vendor");
System.out.println(vendor.getName()); //Intel
分享到:
相关推荐
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
java注解和反射的个人学习笔记
Java反射是Java编程语言中的一个强大特性,允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射主要用于以下场景:动态加载类、访问私有成员、调用私有方法以及处理泛型等。以下是关于Java反射的一些...
8. **反射机制**:探讨Java反射API的使用,包括动态获取类信息、创建对象、调用方法等功能,这对于理解和调试程序有很大的帮助。 9. **JVM内部机制**:简述Java虚拟机的工作原理,包括类加载、内存管理、垃圾回收...
"Java入门第三季学习笔记"可能涵盖了更多高级话题,如反射、注解、设计模式和Java库的使用。反射允许程序在运行时检查类、接口、字段和方法的信息,提供了更大的灵活性。注解是一种元数据,可以用来提供编译器或运行...
java学习笔记java反射机制
### Java李兴华学习笔记之Java常用类库 #### 一、课程介绍及知识点概览 根据提供的资料,“Java李兴华学习笔记之Java常用类库”这份文档来源于北京MLDN软件实训中心的教学资料,主要涵盖了Java编程语言中常用类库...
本篇笔记将深入探讨Java反射的概念、重要性以及如何使用。 一、反射基础 1. 类加载:当Java虚拟机(JVM)加载一个类时,它会创建该类的Class对象。这个对象包含了关于类的所有信息,包括方法、字段、构造器等。...
本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...
《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...
在“java反射笔记”这个主题中,我们将深入探讨反射的基础知识和常见用法。 首先,我们需要了解什么是反射。在Java中,反射是指在运行时获取类的信息(如类名、方法名、参数类型等)并动态调用对象的方法或访问其...
8. **反射机制**:Java反射API允许在运行时动态访问类的信息,包括类名、方法、字段等。学习笔记会讲解如何使用反射进行元编程,以及其在插件系统、序列化和动态代理中的应用。 9. **Java API和库**:Java标准库...
Java反射机制是Java编程语言的一项重要特性,它允许程序在运行时动态地获取类的信息,并且能够对类的属性和方法进行操作。反射机制的核心在于Java的`java.lang.reflect`包,其中包含了`Class`、`Constructor`、`...
1. **反射**:Java反射机制允许在运行时检查类的信息(如类名、方法、字段等),并能动态调用方法和修改字段值,增强了代码的灵活性。 2. **泛型**:泛型提供了一种在编译时检查类型安全的方法,允许在类、接口和...
"java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...
"Java超强学习笔记"显然是一份全面且深入的Java学习资料,由一位极具洞察力和组织能力的作者精心编纂。这份笔记可能包含了从基础知识到高级特性的全方位讲解,旨在帮助学习者构建坚实的Java编程基础,并提升他们的...
这份“Java学习笔记(必看经典).doc”文档将涵盖Java的核心概念和重要知识点,对于初学者和有经验的开发者来说都是宝贵的参考资料。 首先,Java的基础部分通常包括以下几个方面: 1. **Java语法基础**:这是所有...
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....