- 浏览: 136792 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (130)
- java基础 (9)
- java高级 (19)
- struts2.x (2)
- spring (1)
- hibernate (1)
- jpa (1)
- ibatis (2)
- javascript (4)
- jsp (2)
- sql (9)
- oracle (12)
- extjs (0)
- uml (0)
- 关于面试 (4)
- 常用软件晋级 (5)
- 网络编程 (1)
- XML (1)
- servlet (5)
- jquery (6)
- Tomcat (3)
- Android (17)
- ssl (1)
- c 指针 (0)
- c/c++/oc (3)
- ios (7)
- 设计模式 (0)
- 终端命令 mac (2)
- sqlite3 (1)
- linux (7)
- hadoop (2)
- 特效 (3)
- 架构之路 (2)
- p2p (1)
- 常见问题 (0)
- html (1)
最新评论
-
zaocha321:
建议改一下文章中的错别字。
多线程(二) -
shamusoft:
在iPhone上是采用sqlite进行数据存储是我一种比较习惯 ...
sqlite3 相关操作 -
bear1122ccc:
这是给学习IOS的人打气呀。顶下。
初学ios -
shamusoft:
<Connector className="o ...
SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程) -
shamusoft:
去掉拖动ListView带有的黑色背景: and ...
关于加密
一、反射
1. 一段java代码在程序运行期间会经历三个阶段: source-->class-->runtime
2. Class 对象
在java中用一个Class对象来表示一个java类的class阶段
Class对象封装了一个java类中定义的成员变量、成员方法、构造方法、类名、包名等
3. 反射
反射就是获得一个java类的各个组成部分
4. 反射的用法
1)需要获得java类的各个组成部分,首先需要获得代表java类的 Class 对象
获得Class对象的三种方式:
Class.forName(classname) 用于做类加载
obj.getClass() 用于获得对象的类型
类名.class 用于获得指定的类型,传参用
2) 反射类的成员方法
Class clazz = Person.class;
Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
method.invoke();
3) 反射类的构造函数
Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})
con.newInstance(params...)
4) 反射类的属性
Field field = clazz.getField(fieldName);
field.setAccessible(true);
field.setObject(value);
5. 反射用在哪里
到底框架是什么? 框架就是将开发中大量重复的代码集中起来写个通用的程序
框架就是用反射来实现的
框架需要现在的类调用将来写的类
二、 泛型
1. 泛型是一种可变化的类型
2. 用途:
一个类的多个成员方法用到的参数类型都是未知的类型,但又需要是同一个类型,就可将方法的参数类型
定义为泛型,此泛型必须在类上先予以声明才能在方法中使用
一个方法的多个参数和返回值需要是同一个类型,也可以用泛型来解决,在返回值前面声明泛型
3. 泛型的基本概念
以List<E>为例:<>念着typeof 例, List<String> 就是 List typeof String
List<E>中的E称为类型参数变量
List<Integer>中的Integer称为实际类型参数
整个List<E>称为泛型类型
整个List<Integer>称为参数化的类型
4. 泛型的使用
1)使用带泛型的类时,在创建对象时可以为泛型指定实际类型参数,指定的具体类型相当于给泛型传参
2)子类在继承父类的时候,可以为父类定义的泛型指定实际类型参数
class B<T>
class A extends B<String>
通过子类A获得的父类类型就是一个参数化的类型
3)调用方法时传入参数的具体类型将作为方法中泛型的实际类型
三、注解
1. jdk中自带的三个注解
@Deprecated 声明方法已过时
@SuppressWarnings 取消编译器警告
@Override 声明方法是继承自父类
2. 什么是注解
注解就是java代码中的特殊标记,它用于告诉调用者类应该如何被运行
注解相当于配置文件的功能
3. 自定义注解
使用 @interface 关键字可以声明一个注解
public @interface MyAnnotation1
注解中可以定义属性
String name default “aaa”;
value是注解中的特殊属性
注解中定义的属性如果名称为 value, 此属性在使用时可以省写属性名
4.元注解 元Annotation
元注解简单理解为 注解的注解
类似于描述一个注解的信息的配置文件
@Retention 指定注解的作用域
RetentionPolicy.SOURCE
RetentionPolicy.CLASS
RetentionPolicy.RUNTIME
@Target:指定注解用于修饰类的哪个成员.
@Target 包含了一个名为 value,类型为ElementType的成员变量。
@Inherited: 被它修饰的 Annotation 将具有继承性.
如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解
5. 反射注解
在程序可以通过反射来获取注解中封装的值
四、动态代理
评论
Java反射机制主要提供以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
2 Java Reflection API简介
在JDK中,实现反射机制的类都位于java.lang.reflect包中。
◆Class类:描述类信息的类。
◆Field类:代表类的成员变量。用来描述属性的信息。
◆Method类:代表类的方法。方法信息的描述。
◆Constructor类:代表类的构造方法。描述构造方法的信息。
◆Array类:提供了动态创建数组,以及访问数组元素的静态方法。
java.lang.Class类是Java中一个特定类的实现。一个Class类的对象用于表示当前运行的程序中的类。
每个类都有一个相应的Class对象。该对象存储于编译后类文件中。当JVM装载一个.class文件时就会装载一个Class对象。
3 使用Reflection
reflection的常用操作:
操作一:获得类的 java.lang.Class 对象。
用 Class 类描述类和接口。
1. 用“ 类名.class ”获得该类的类对象(Class c = int.class) 。
2. 用类的对象调用getClass(),如object.getClass()得到这个对象的类对象 (例:Person p;Class c=p.getClass();) 。
3. 使用Class.forName(类名),得到这个类的类对象,
4. (注意:这里写的类名必须是全限定名,是包名加类名: XXX.XXX.XXXX)
Class类的常用方法:
1. forName(String className)
返回与带有给定字符串名的类或接口相关联的 Class 对象。
2. isInterface()
判定指定的 Class 对象是否表示一个接口类型。
3. isPrimitive()
判定指定的 Class 对象是否表示一个基本类型(如int等)。
4. isArray()
判定此 Class 对象是否表示一个数组类。
5. getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
6. isInstance(Object obj)
判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
操作二:调用 getDeclaredMethods方法,取得该类中定义的所有方法的列表。
Method类提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法。
常用方法:
getDeclaredAnnotations():返回直接存在于此元素上的所有注释。
getDeclaringClass():返回表示声明由此 Method 对象表示的方法的类或接口的 Class 对象。
getName():以 String 形式返回此 Method 对象表示的方法名称。
getParameterTypes():按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。
getExceptionTypes():返回 Class 对象的数组,这些对象描述了声明将此 Method 对象表示的基础方法抛出的异常类型。
getReturnType():返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。
操作三:获取构造器信息
获取类构造器的用法与上述获取方法的用法类似。
Constructor 类提供关于类的单个构造方法的信息以及对它的访问权限。
操作四:获取类的属性
Field 类提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类静态字段或实例字段。
常用方法:
getName():返回此 Field 对象表示的字段的名称。
getDeclaringClass():返回表示类或接口的 Class 对象,该类或接口声明由此 Field 对象表示的字段。
getType(): 返回一个 Class 对象,标识此 Field 对象所表示字段的声明类型。
getModifiers():以整数形式返回此 Field 对象表示的字段的语言修饰符。
操作五:根据方法的名称来执行方法
可以用 reflection 执行一个指定名称的方法。
即一个程序在执行到某处的时候才知道需要执行某个方法,这个方法的名称是在程序的运行过程中指定的 。
说明:
Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象。
操作六:创建新的对象
使用无参构造方法,只需要用class对象的newInstance方法。
Class c=Class.forName(类名);
Person p =(Person)c.newInstance;
newInstance()与new作用相同,是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
使用有参的构造方法,步骤如下:
① 获取指定类的对象
② 通过Class对象获取满足指定参数的要求的构造方法类对象
Constructor cons = c.getConstructor(String.class);
③ 调用指定Constructor对象的newInstance方法,传入对应的参数值,创建出对象。
Person p =(Person)cons.newInstance(“张三”);
说明:
根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值。
操作七:改变字段(域)的值
reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它。
操作八:使用数组
reflection 可以创建数组。
客户端程序如何调用服务器端的某类对象的方法呢?显然客户端需要把调用的方法名、方法参数类型、方法参数值,以及方法所属的类名或接口名发送给服务器,服务器再调用相关对象的方法,然后把方法的返回值发送给客户端。
============================================================
代理模式是常用的Java设计模式,它的特征是代理类与委托类有同样的接口。
代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
按照代理类的创建时期,代理类可分为两种。
◆静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
◆动态代理类:在程序运行时,运用反射机制动态创建而成。
说明:
HelloServiceProxy类是代理类,HelloServiceImpl类是委托类,这两个类都实现了HelloService接口。其中HelloServiceImpl类是HelloService接口的真正实现者,而HelloServiceProxy类是通过调用HelloServiceImpl类的相关方法来提供特定服务的。HelloServiceProxy类的echo()方法和getTime()方法会分别调用被代理的HelloServiceImpl对象的echo()方法和getTime()方法,并且在方法调用前后都会执行一些简单的打印操作。
由此可见,代理类可以为委托类预处理消息、把消息转发给委托类和事后处理消息等。
23.5.2? 动态代理类
与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java反射机制可以生成任意类型的动态代理类。java.lang.reflect包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。
Proxy类提供了创建动态代理类及其实例的静态方法。
(1)getProxyClass()静态方法负责创建动态代理类,它的完整定义如下:
public static Class<?> getProxyClass(ClassLoader?loader, Class<?>...?interfaces) throws IllegalArgumentException
参数loader指定动态代理类的类加载器,参数interfaces指定动态代理类需要实现的所有接口。
(2)newProxyInstance()静态方法负责创建动态代理类的实例,它的完整定义如下:
public static Object newProxyInstance(ClassLoader?loader, Class<?>[]?interfaces, InvocationHandler?h) throws IllegalArgumentException
参数loader指定动态代理类的类加载器,参数interfaces指定动态代理类需要实现的所有接口,参数handler指定与动态代理类关联的 InvocationHandler对象。
软件包 java.lang.reflect 的描述
提供类和接口,以获得关于类和对象的反射信息。在安全限制内,反射允许编程访问关于加载类的字段、方法和构造方法的信息,并允许使用反射字段、方法和构造方法对其底层对等项进行操作。
如果必需的 ReflectPermission 可用,则 AccessibleObject 允许抑制访问检查。
Array 提供动态创建和访问数组的静态方法。
此包中的类以及 java.lang.Class 可以适应以下应用程序的需要:调试程序、解释程序、对象检查程序、类浏览程序,以及服务(比如,Object Serialization 和 JavaBean,它们需要访问目标对象(基于其运行时类)的公共成员或给定类声明的成员)。
发表评论
-
maven 学习参考文章
2015-02-10 09:06 564maven环境快速搭建 http://www.cn ... -
用struts 包控制权限的文章
2015-01-09 09:23 605http://www.cnblogs.com/Johness/ ... -
IE 兼容模式 quirks 网页变形
2014-11-27 23:14 706http://www.cnblogs.com/0000/ar ... -
oracle 日期操作
2014-10-16 16:53 645Oracle 获取当前日期及日期格式 获取系统日期: ... -
freemark hellword
2014-09-11 20:32 9581、所需的材料: 主料: myeclipse(我用的版 ... -
学习FreeMaker
2014-04-10 16:41 624原文地址 :http://tailshe ... -
JSONOBJ 转换对象
2013-12-22 13:13 1008import java.lang.reflect.Field ... -
p2p 企业信贷 UML 跨行清算
2013-12-07 23:09 629p2p 银行业务 http://blog.csdn.net ... -
glassfish 集群
2013-12-05 14:35 758感谢猫咪文章,在此做 ... -
c语言的指针
2012-02-27 09:08 821C语言中的精华是什么,答曰指针,这也是C语言中唯一的难点。 C ... -
本地域名解析操作步骤:
2012-02-22 09:40 01.打开C:\WINDOWS\system32\drive ... -
SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)
2012-02-14 08:57 1600SSL协议的工作流程: ... -
android httpclient https 单向连接tomcat
2012-02-08 17:01 1688双向篇还未实现,先记录单向验证方式。? 一 Android直接 ... -
关于加密
2011-12-27 14:01 1016keytool -genkey -alias shamusof ... -
jdk1.5新特性 增强for循环
2011-06-03 06:52 849[code="java"] ... -
用反射实现通用Dao
2011-05-26 16:56 1439public class MySession { /** ... -
代理实现过滤器例子
2011-05-26 07:29 931package cn.itcast.proxy; imp ... -
动态代理 测试代码
2011-05-26 06:25 725import java.lang.reflect.Constr ... -
工厂模式
2011-05-10 10:39 688分析:工厂模式 工厂模式目的就是解耦。解耦目的是为了一个类的 ...
相关推荐
Java基础入门系列是帮助初学者掌握Java编程的重要学习材料,本篇主要介绍了泛型、反射和注解这三大高级特性。 泛型是Java SE 5版本引入的一个新特性,它的主要目的是允许在使用类、接口和方法时能够引用到任何类型...
先说一下遇到的问题:通过使用GSON泛型进行报文转换的时候想要对部分关键字段加密,发现在封装好的方法中,对个别字段的加密满足不了。 解决过程:首先通过反射获取到bean下的对象名称。 对象名称获取到了之后需要...
反射操作注解与反射操作泛型 在 Java 编程中,反射操作和泛型是两个重要的概念。反射操作是指在运行时检查和修改类、对象、方法、字段等信息的能力,而泛型是指在编译时检查和限制类型的能力。本文将详细介绍反射...
在Java编程领域,反射、泛型和注解是三个非常重要的特性,它们为代码提供了高度的灵活性和可扩展性。在本实战项目中,我们将深入探讨如何利用这些特性实现一个类似Spring框架的核心注入机制,即控制反转(Inversion ...
在Java编程中,反射、注解(Annotation)和泛型是三个非常重要的特性,它们各自在不同的场景下发挥着关键作用。这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM...
Java设计模式、程序设计、反射、注解和泛型是Java开发中的核心概念,它们各自在不同的场景下发挥着重要作用,构建出高效、可维护的软件系统。 首先,Java设计模式是面向对象编程中的一种最佳实践,是解决常见问题的...
本篇文章将详细探讨C#中的泛型、反射以及如何利用这些特性来实现自动生成SQL语句。 **一、C# 泛型** 泛型是C#的一个核心特性,它允许我们编写类型参数化的代码,即代码可以在多种数据类型上工作,而无需进行显式的...
反射在序列化、注解处理、动态代理等领域有广泛应用。 泛型是Java SE 5.0引入的新特性,旨在提供类型安全,减少类型转换的错误,并提高代码的可读性和可维护性。泛型可以用于类、接口和方法,通过类型参数定义,...
本教程将深入探讨如何通过反射获取类、方法上的注解以及注解中的值和方法参数。 1. **注解的定义与使用** 注解以`@`符号开头,后面跟着注解的类型。例如,`@Override`表示方法重写,`@Deprecated`表示某个功能已...
本课程是《 java就业班》系统课程的第24章,全套课程精细讲解,该课程超过其他机构30%的课程量,经过我们全套课程系统学习的同学,可轻松从事Java高级工程师或系统架构师岗位,课程提供全套代码笔记其它相关素材及...
5. **注解处理**: 反射机制还可以用来读取类、方法或字段上的注解,这对于实现元数据驱动的设计非常有用。 **Java泛型** Java泛型是自Java 5引入的一种类型安全机制,它允许在编译时检查类型,从而避免了类型转换...
Java中的反射机制、泛型和注解是三个重要的概念,它们在编程中有着广泛的应用。 首先,反射(Reflection)是Java提供的一种强大的元数据访问机制,允许程序在运行时检查和操作类、接口、字段和方法的信息。在上述...
5. **泛型与反射**:由于Java的泛型是类型擦除,反射无法直接获取泛型信息,但可以通过方法签名或注解间接获取。 6. **注解与反射**:反射可以读取类、方法、字段上的注解信息,这在运行时动态处理逻辑、实现插件化...
3. **泛型类型信息获取**:反射可以获取到泛型的实际类型,这在没有泛型源码的情况下非常有用。 4. **动态代理**:如Java的`java.lang.reflect.Proxy`类可以用来创建动态代理,实现接口的方法调用。 本压缩包“java...
在Android开发中,反射和泛型的结合常常用于框架的实现,例如依赖注入框架如Dagger或Butter Knife,它们需要在运行时动态创建对象并注入依赖,这时就需要解析带有泛型的注解。此外,ORM框架(如GreenDao、...
poi通过反射,泛型,注解来实现通用的poi导出导入公共类。
泛型是Java SE 1.5的新特性,好处是在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。JAVA反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对以后学习框架有很大的帮助。...
通过以上对Java异常处理、反射机制、注解以及泛型的深入解析,我们可以看出这些基础知识点对于理解和编写高质量的Java程序至关重要。掌握这些核心概念不仅能帮助我们编写更加健壮和灵活的代码,还能让我们更好地理解...
例如,使用`@Column`注解或其他自定义注解,然后在映射配置中通过反射解析这些注解,实现灵活的数据库映射。 总之,泛型和反射机制在Hibernate中的结合,使得开发人员能够更加方便地处理Java对象与数据库之间的映射...