`
baby69yy2000
  • 浏览: 187735 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
社区版块
存档分类
最新评论

java 反射学习笔记

    博客分类:
  • Java
阅读更多
(一) 得到字节码的三种方式
//第一种方式:
//得到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基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    java注解和反射的个人学习笔记

    java注解和反射的个人学习笔记

    Java反射学习笔记

    Java反射是Java编程语言中的一个强大特性,允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射主要用于以下场景:动态加载类、访问私有成员、调用私有方法以及处理泛型等。以下是关于Java反射的一些...

    java学习笔记markdown

    8. **反射机制**:探讨Java反射API的使用,包括动态获取类信息、创建对象、调用方法等功能,这对于理解和调试程序有很大的帮助。 9. **JVM内部机制**:简述Java虚拟机的工作原理,包括类加载、内存管理、垃圾回收...

    Java入门学习笔记

    "Java入门第三季学习笔记"可能涵盖了更多高级话题,如反射、注解、设计模式和Java库的使用。反射允许程序在运行时检查类、接口、字段和方法的信息,提供了更大的灵活性。注解是一种元数据,可以用来提供编译器或运行...

    java学习笔记java反射机制

    java学习笔记java反射机制

    java李兴华学习笔记之Java常用类库

    ### Java李兴华学习笔记之Java常用类库 #### 一、课程介绍及知识点概览 根据提供的资料,“Java李兴华学习笔记之Java常用类库”这份文档来源于北京MLDN软件实训中心的教学资料,主要涵盖了Java编程语言中常用类库...

    java学习——java中的反射学习笔记.rar_java 反射

    本篇笔记将深入探讨Java反射的概念、重要性以及如何使用。 一、反射基础 1. 类加载:当Java虚拟机(JVM)加载一个类时,它会创建该类的Class对象。这个对象包含了关于类的所有信息,包括方法、字段、构造器等。...

    java学习笔记(java 反射机制 流 内存管理)

    本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...

    JAVA学习笔记 林信良

    《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...

    java反射笔记

    在“java反射笔记”这个主题中,我们将深入探讨反射的基础知识和常见用法。 首先,我们需要了解什么是反射。在Java中,反射是指在运行时获取类的信息(如类名、方法名、参数类型等)并动态调用对象的方法或访问其...

    Java学习笔记(源码)

    8. **反射机制**:Java反射API允许在运行时动态访问类的信息,包括类名、方法、字段等。学习笔记会讲解如何使用反射进行元编程,以及其在插件系统、序列化和动态代理中的应用。 9. **Java API和库**:Java标准库...

    java反射机制学习笔记

    Java反射机制是Java编程语言的一项重要特性,它允许程序在运行时动态地获取类的信息,并且能够对类的属性和方法进行操作。反射机制的核心在于Java的`java.lang.reflect`包,其中包含了`Class`、`Constructor`、`...

    Java基础尚硅谷宋红康学习笔记

    1. **反射**:Java反射机制允许在运行时检查类的信息(如类名、方法、字段等),并能动态调用方法和修改字段值,增强了代码的灵活性。 2. **泛型**:泛型提供了一种在编译时检查类型安全的方法,允许在类、接口和...

    java校招学习笔记

    "java校招学习笔记"显然是针对应届毕业生或求职者准备的,旨在帮助他们掌握Java的基础知识和校招面试中常见的技术问题。这份笔记可能包含了从基础概念到进阶主题的全面概述,以提高求职者的竞争力。 首先,Java的...

    java超强学习笔记

    "Java超强学习笔记"显然是一份全面且深入的Java学习资料,由一位极具洞察力和组织能力的作者精心编纂。这份笔记可能包含了从基础知识到高级特性的全方位讲解,旨在帮助学习者构建坚实的Java编程基础,并提升他们的...

    Java学习笔记(必看经典).doc

    这份“Java学习笔记(必看经典).doc”文档将涵盖Java的核心概念和重要知识点,对于初学者和有经验的开发者来说都是宝贵的参考资料。 首先,Java的基础部分通常包括以下几个方面: 1. **Java语法基础**:这是所有...

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

Global site tag (gtag.js) - Google Analytics