`
IT_nice
  • 浏览: 8784 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_反射

阅读更多

------- android培训java培训、期待与您交流! ----------

反射(Reflect):就是将java类中的各种成分映射到相应的类。

Java反射机制提供如下功能:

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判段任意一个类所具有的成员变量和方法

在运行时调用任一个对象的方法

在运行时创建新类对象

在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。

1.      动态语言:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言

2.     java的动态机制:但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

3.     Class类

a)        Java有个Object 类是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等其中getClass()返回一个Class 对象。

b)       Class 类十分特殊。它和一般类一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象,注意它的private Class() {},意指不允许任何人经由编程方式产生Class object。是的,其object 只能由JVM 产生。

4.     获取对应的Class

a)       对象.getClass()    如: Class c=”abc”.getClass();

b)       Class.getSuperclass() 如:Class c2 =c1.getSuperclass();//获得父类

c)        static method--Class.forName()(最常被使用)

如:Classc=Class.forName(“java.util.LinkedList$Entry”);

d)       基本类型的包装类的TYPE 如:Classc=Integer.TYPE 返回原生类型,这里是int

e)        类名.Class 如Classc=String.Class

5.      获取Fields JAVA 的Class<T>类提供了几个方法获取类的属性。

a)        publicField getField(String name) 它反映此 Class 对象所表示的类或接口的指定公共成员

b)       publicFileld getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括private)

c)        publicField[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此Class 对象所表示的类或接口的所有可访问公共字段

d)       publicField[] getDeclaredField() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段(包括private)

6.      注意:如果用getDeclaredField或getDeclaredField获取了private 权限的成员时又想要对其访问时需要用到 暴力反射 Field f=p.getClass().setAccessible(true); 设置可访问性

7.      获取Method

a)        publicMethod getMethod(String name,Class<?>…parameterType) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法

b)       publicMethod[] getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法

c)        publicMethod getDeclaredMethod(Stringname,Class<?>…parameterTyprs返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法

d)       publicMethod[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

8.      注意:调用此函数使用 public Object invoke(Object obj,Object…args)

Method method=str.getClass().getMethod(“charAt”,int.class)

Method.invoke(str,0);//jdk 1.5

9.      接收数组参数的成员方法的反射

a)        如main(String[] args)函数 Class clazz=Class.forName(“main”,String[].class)

由于jdk1.4和jdk1.5的invoke发生了变化,由1.4的数组参数变成了1.5的可变个数,如果参数本身是非基本类型数组则会将数组进行拆分,所以要对这里进行特殊处理 如 clazz.invoke(null,Object[]{new String[]{“123”,”abc”}})或

calzz.invoke(null,(Object)new String[]{“123”,”abc”});

10.  获取类的Constructor通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例

a)        publicConstructor<T> getConstructor(Class<?>... parameterTypes)   返回一个 Constructor 对象,它反映此Class 对象所表示的类的指定公共构造方法

b)       publicConstructor<?>[] getConstructors()   返回一个包含某些 Constructor 对象的数组,这些对象反映此Class 对象所表示的类的所有公共构造方法

c)        publicConstructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,该对象反映此Class 对象所表示的类或接口的指定构造方法

d)       publicConstructor<?>[] getDeclaredConstructors() 返回Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法

12.  反射在框架中的开发框架与反射的关系:框架可以通过反射机制预先搭建引用实际未开发好的功能,而工具类是被用户所调用,框架则是调用用户提供的类

13.  用类加载器的方式管理资源和配置文件:通过加载配置文件中的属性加载所配置的类

package cn.itcast.reflect.demo;

import cn.itcast.domain.Person;

public class Reflect_GetClassDemo {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		
		/*
		 * 要想获取字节码文件中的成员,必须要先获取字节码文件对象。
		 * 获取字节码文件对象的方式:
		 * 1,通过Object类中的getClass方法。
		 * 2,使用的任意数据类的一个静态成员class,所有的数据类型都具备的一个属性。
		 * 3,使用Class类中的forName方法。通过给定类名来获取对应的字节码文件对象。
		 */
		
		getClass_3();
	}

	public static void getClass_3() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		
		String className = "cn.itcast.domain.Person";
		
		/*
		 * 1,通过给定的类名称,加载对应的字节码文件,并封装成字节码文件对象Class.
		 */
		Class clazz = Class.forName(className);
//		System.out.println(clazz);
		
		//通过newInstance()就可以创建字节码对象所表示的类的实例。
		/*
		 * 2,通过new创建给定的类的实例。
		 * 3,调用该类的构造函数。
		 * 通常被反射的类都会有提供空参数的构造函数。
		 * 没有对应的构造函数,会报InstantiationException
		 * 如果有提供,但是权限不够,会报IllegalAccessException
		 * 
		 */
		Object obj = clazz.newInstance();
		
		
		/* Person p = new Person();
		 * 1,加载Person类,并将Person类封装成字节码文件对象。
		 * 2,通过new创建Person对象。
		 * 3,调用构造函数对对象初始化。
		 */
		System.out.println(obj);
		
	}

	public static void getClass_2() {
		
		Class clazz = Person.class;
	}

	public static void getClass_1() {
	
		Person p1 = new Person();
		Person p2 = new Person();
		Class clazz1 = p1.getClass();
		Class clazz2 = p2.getClass();
		System.out.println(clazz1 == clazz2);//true

//		System.out.println(clazz1.getName());//获取类的名字。
	}
}
//类Person
package cn.itcast.domain;

public class Person {

	private String name;
	private int age;
	public Person() {
		super();
		System.out.println("person run");
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	
	public void show(String name,int age){
		
		System.out.println("show run...name="+name+",age="+age);
	}
	
	public static void staticShow(){
		System.out.println("static show run");
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	
	
	
}
 

 

分享到:
评论

相关推荐

    01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip

    【标题】"01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip" 提供的是一门由黑马程序员机构推出的Java基础强化课程,由讲师张孝祥主讲,旨在深入讲解Java编程的基础知识并进行能力提升。 【描述】中提到...

    黑马程序员_Java基础辅导班教程课件[第01期]第13天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第13天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java开发的基本技能。第13天的课程通常会涵盖上一天(第12天)所学...

    黑马程序员入学面试题

    暴力反射是一种非常规的反射技术,它可以绕过Java的安全限制,强制访问私有成员和类,这在某些情况下可能会带来安全风险。 #### 14. 反射获取字节码对象方式、创建对象的两种方式 - **获取字节码对象**:可以通过...

    黑马程序员java面试宝典 完整版PDF.rar

    《黑马程序员Java面试宝典》是一本专门为Java开发者准备的面试指南,包含了广泛而深入的Java技术知识,以及面试过程中可能会遇到的各种问题。这本书的完整版PDF提供了丰富的学习材料,帮助求职者提升自己的技术水平...

    黑马程序员入学Java知识——精华总结

    含面向对象,异常处理和常用类,线程技术,集合框架,IO操作,网络编程,文件操作,反射机制,

    黑马程序员------类加载器学习注意点

    本文将主要围绕“黑马程序员------类加载器学习注意点”展开,探讨一些关键知识点。 首先,我们需要理解类加载器的基本工作原理。在Java中,类加载过程包括加载(Loading)、验证(Verification)、准备...

    黑马程序员java基础试题、笔记

    "黑马程序员java基础试题、笔记"这个压缩包资源为Java初学者和希望加入"黑马程序员"培训课程的学员提供了丰富的学习材料。这些资源包括面试问题合集、整理的资料、Android面试题、学员入学面试总结、面试技巧、必须...

    黑马程序员面试宝典(java)2018版

    《黑马程序员面试宝典(java)2018版》是一本专门为Java开发者准备的面试指南,涵盖了大量在面试过程中可能遇到的问题和知识点。这本宝典由黑马程序员机构精心编纂,汇集了近万名学员的实际面试经验,为求职者提供了...

    黑马程序员入学Java知识——精华总结.doc

    程序员编写代码,计算机执行这些代码,最终产生预期的结果。 2. **Java语言的特点**: - **简单性**:Java简化了C++的一些复杂特性,如指针,使得初学者更容易上手。 - **面向对象**:Java强调类和对象,支持封装...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--aidl之结合反射获取应用缓存大小等空间占用 |--aidl调用系统service未公开的方法挂电话 |--aidl调用系统未公开的方法代码示例2 |--android dp和px之间转换 |--android INSTALL_PARSE_FAILED_MANIFEST_MALFORMED |...

    黑马程序员----泛型与反射的小运用

    在Java编程语言中,泛型和反射是两个非常重要的特性,它们在软件开发中有着广泛的应用。本篇文章将深入探讨这两个概念以及它们在实际开发中的小运用。 首先,我们来看泛型(Generics)。泛型是在Java SE 5.0引入的...

    黑马程序员---注解归纳

    在本篇“黑马程序员---注解归纳”中,我们将深入探讨注解的基本概念、类型以及它们在实际开发中的应用。 首先,注解在Java中是一种特殊的声明,以`@`符号开头,后面跟着注解的名称。它们可以应用于类、接口、方法、...

    黑马程序员《Java自学宝典》源代码

    Java自学宝典是针对初学者和有一定基础的学习者设计的一套完整的Java学习资源,由知名的教育机构黑马程序员出品。这份源代码压缩包包含了书中各个章节的实例代码,旨在帮助学习者深入理解Java编程语言的核心概念和...

    黑马程序员----泛型学习注意点

    黑马程序员提供的这篇关于泛型的学习注意点,结合了源码分析和工具应用,旨在帮助开发者深入理解并有效运用泛型。下面将详细阐述泛型的主要知识点: 1. 泛型的基本概念: 泛型是Java SE 5.0引入的新特性,主要用于...

    2018年最新传智博客黑马程序员JavaEE49期全套视频,亲测有效

    该套视频课程作为2018年传智博客黑马程序员JavaEE49期的全套资源,不仅覆盖了JavaEE的基础理论知识,还深入介绍了多种主流框架的实际应用,并提供了丰富的实战案例。对于想要入门或提高JavaEE开发能力的学习者而言,...

    Java基础案例教程.rar

    本教程出自知名教育机构黑马程序员,该机构以其深入浅出的教学方式和实用的案例著称。 在本教程中,你将学习到以下关键知识点: 1. **Java环境搭建**:首先,你需要了解如何下载和安装Java Development Kit (JDK)...

    黑马程序员入学测试题详解

    并使用反射手段创建该类的对象, 并调用该对象中的方法。 6、 把当前文件中的所有文本拷贝,存入一个txt文件,统计每个字符出现的次数并输出,例如: a: 21 次 b: 15 次 c:: 15 次 把: 7 次 当: 9 ...

    Java基础案例教程(第2版)_PPT.zip

    16. **反射机制**:反射允许在运行时动态访问和修改类的信息,是Java的高级特性,常用于插件开发、元编程等场景。 17. **泛型**:泛型引入后,可以在编译时检查类型安全,减少强制类型转换,提升代码的可读性和可...

Global site tag (gtag.js) - Google Analytics