Java基础加强学习笔记(二)
一、反射的基础Class类
1、如何得到各个字节码对应的实例对象
(1)类名.class,例如 System.class
(2)对象.getClass(),例如 new Data().getClass()
(3)Class.forName("包.类名"),例如 Class.forName("java.util.Data") 查询或加载,即有了就用,没有就加载进来
2、九个预定义的Class实例对象
8个基本类型+1个void
二、反射
1、定义:反射就是把java类中的各种成分映射成相应的java类。
2、构造方法的反射应用,class ->constructor -> object
(1)
Constructor[] constructors = Class.getName("java.lang.String").getConstructors();
(2)
//new String(new StringBuffer("abc"));
Constructor constructor = String.class.getConstructor(StringBuffer.class);
String str = (String)constructor.newInstance(new StringBuffer("abc"));// *.newInstance("abc")运行时错误
//String.class获得String类的字节码
//String.class.getConstructor()通过字节码获得该类的相对应的构造函数
//constructor.newInstance()通过构造函数生成该类的对象
//(String) :newInstance()返回类型为Object,多态,因此必须强制转化为String
//Person p = new Chinese();
//Chinese c = (Chinese)p;
(3)Class.newInstance()。先得到默认构造方法,即无参数的构造方法,然后利用无参数构造方法来创建对象。
利用缓存机制来保存默认构造方法的实例。
3、Field类 成员变量的反射应用
(1)使用
/*
class Student{
private String name;
public int age;
public Student(String name,int age){
this.name = name;
this.age = age;
}
}
*/
Student zs = new Student("zhangsan",23);
Field fieldAge = zs.getClass().getField("age");
sop(fieldZ.get(zs));
Field fieldName = zs.getClass().getDeclaredField("name");//可以得到私有的变量
fieldName.setAccessible(true); //设置为可以访问
sop(fieldName.get(zs)); //才可以访问
//fieldZ不是一个值,而是该类的所有对象都有的一个字节码属性,通过fieldZ.get(对象)来获取某个对象的该属性的具体值
//getDeclaredField()
//setAccessible(true
(2)实例:改变对象中所有String类型的值中的a改为b
public void changFieldValue(Object obj) throws Exception{
Field[] fields = obj.getClass().getFields();
for(Field field : fields){
if(field.getType() == String.class){ //比较字节码,唯一,故此处使用 == 而不推荐用equals()
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace("a","b");
field.set(obj,newValue);
}
}
}
4、Method类 方法的反射应用
(1)
/**传统方法
String str = "abc";
str.charAt(2);
*/
//反射方法
Method mycharAt = Class.getName("java.lang.String").getMethod("charAt",int.class);//
sop(mycharAt.invoke(str,2));//invoke(null,2);第一个参数如果为null,则表示为静态方法
(2)用反射方式执行某个类中的main方法
/*
传统方式
//Test.main(new String[]{"as","234"});
*/
//反射方式
Method method = Class.forName(className).getMethod("main",String[].class);//className类的string表示
method.invoke(null,new Object[]{new String[]{"as","234"}});
//由于jdk1.5为了兼容1.4之前的版本,故此处jvm会将参数数组拆开,作为两个参数传入.因此用object数组封装起来
//或者(Object)new String[]{"as","234"},告诉编译器将其作为一个对象传入,而不拆包
5、数组的反射
6、HashSet如何保证元素唯一性?
是通过元素的两个方法,hashCode()和equals()来完成。
*如果元素的HashCode值相同,才会判断equals是否为true。
*注意,对于判断元素是否存在、及删除都是依赖于以上两个方法。而ArrayList只依赖于equals()
*一般,对象存入HashSet之后,就不要修改那些hashCode()方法依赖的变量,否则会改变hashCode()的计算一致性,
此时再执行remove()等方法时无法正确操作,从而产生内存泄露。
7、框架的实现(集合) 反射应用
三、内省(IntroSpector)
用于对javaBean进行操作,javaBean特殊的java类
javaBean
1、用内省方式对javaBean的属性进行set get操作
Person p = new Person("zhangsan",23);
PropertyDescriptor pd = new PropertyDescriptor("name",p.getClass());
Method methodGetName = p.getReadMethod();
Object retVal = methodGetName.invoke(p);
Method methodSetName = p.getWriteMethod();
Object retVal = methodGetName.invoke(p,"zhang");
2、使用BeanUtils工具包操作javaBean
需要导入BeanUtils包以及第三方jar包(log包)
好处:(1)类型自动转换,使用String
(2)支持属性的级联 Data data = new Data();
data.time作为属性来用
(3)BeanUtils可以操作map
sop(BeanUtils.setProperty(p,"age"),"23");//参数为String
sop(BeanUtils.getProperty(p,"age"));
PropertyUtils不进行类型转换
四、注解Annotation(1.5之后)
@Override @Deprecated @SuppressWarnings
1、也叫元数据。相当于一种标识
2、作用分类
编写文档:通过代码里标示的元数据生成文档(生成doc文档)
代码分析:通过元数据对代码进行分析(使用反射)
编译检查:通过标示的元数据让编译器实现基本的编译检查(Override)
3、使用位置
包 类 成员变量 方法 局部变量
4、注解相当于一种特殊的类
5、注解的应用结构图(见知识图)
@Override RetentionPolicy.SOURCE
@Deprecated RetentionPolicy.RUNTIME
@SuppressWarningsRetentionPolicy.SOURCE
@Target(ElementType.METHOD)//该注解用在方法上
@Target({ElementType.METHOD,ElementType.Type})//该注解用在方法和类型上
Class类实现Type接口 Class Enum @Override Interface 都是Type(1.5之后)
注解类
@Retention(RetentionPolicy.RUNTIME)//元注解 ,三个阶段
@Interface A{
}
使用注解类的类
@A
class B{
}
对使用注解的类使用反射
@A
class C{
if(C.class.isAnnotationPresent(A.class)){
A ann = (A)C.class.getAnnotation(A.class);
}
}
6、注解的属性
@Retention(RetentionPolicy.RUNTIME)//元注解 ,三个阶段
@Interface A{
String color() default "red";
Strng value();//value()属性很特殊
int[] arr() default {1,2,2}; }
@A(color="red",value="set",arr={1,2,3})//设置,如果只有value属性需要设置时,可以把=号省略@A("setValue")
class C{
if(C.class.isAnnotationPresent(A.class)){
A ann = (A)C.class.getAnnotation(A.class);
sop(ann.color());//使用
sop(ann.value());//使用
sop()
}
}
Java基础加强学习笔记(二)的更多相关文章
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- java基础知识学习笔记
本文知识点以js为参照.对比分析得出笔记.JavaScript之所以叫JavaScript是打算借助java推广自己.虽然都是开发语言,但JavaScript一开始主要运行在 客户端,而java主要运 ...
- Java基础知识学习(二)
Java语法基础 数据类型.类型转换.运算符.逻辑运算符.参考C#,基本一致 输入输出 输出 System.out.print("abc"); System.out.printf( ...
- JAVA 基础加强学习笔记
一.面向对象 (一)继承 1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函 ...
- 《深入理解Java虚拟机》学习笔记(二)
垃圾回收的前提是判断对象是否存活,对象不再存活时将会被回收,下面是2种判断的方法. 引用计数法: 主流的Java虚拟机并没有使用引用计数法来管理内存,重要的原因就是循环引用的问题难以解决. 可达性分析 ...
- java基础(个人学习笔记) A
1. 声明long类型的变量 需要在数值的末尾+l/L.(不加L的话,貌似默认就是int型了.当给long赋值一个超过int范围的值的时候,会出问题.) 2. package java_ ...
- 异常处理——毕向东Java基础教程学习笔记
1.异常:就是程序运行过程中出现的不正常情况. 异常的由来:问题本身也是日常生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象. 其实 ...
- JAVA 基础知识学习笔记 名称解释
Java ee: IDE: itegrity development environment 集成开发环境 JMS: java Message Service java 信息服务 JM ...
- Java基础知识学习笔记(一)
理解面向对象: Java纯粹的面向对象的程序设计语言,主要表现为Java完全支持面向对象的三个基本特征:继承.封装.多态. Java程序的最小单位是类,类代表客观世界中具有某种特征的一类事物,这些类可 ...
随机推荐
- iOS 通过个推 推送原理
目前使用过的第三方推送很多,有极光, 友盟,个推等,现在主要针对个推,谈谈我对推送流程的理解. 在项目中,如果想要实现评论 推送功能 需要进行以下步骤: 1. 在用户登录的时候 通过 [GeTui ...
- java实现excel的导入导出(poi详解)[转]
java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava 经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...
- RHEL7查看网卡配置命令ip addr show
Validating Network Address Configuration To verify the configuration of the network address, you nee ...
- Topcoder SRM 648 (div.2)
第一次做TC全部通过,截图纪念一下. 终于蓝了一次,也是TC上第一次变成蓝名,下次就要做Div.1了,希望div1不要挂零..._(:зゝ∠)_ A. KitayutaMart2 万年不变的水题. # ...
- java集合框架01
List 接口存储一组不唯一(可以重复),有序(插入顺序)的对象 01. ArrayList实现了长度可变的数组,在内存中分配连续的空间.遍历元素和随机访问元素的效率比较高 通过看ArrayList的 ...
- JavaScript基础(一)
JavaScript一.什么是JavaScript?脚本描述语言,网页交互特效,说白了,就是实现HTML实现不了的效果.(JavaScript是一种基于对象.事件驱动的简单脚本语言,嵌入在HTML文档 ...
- Java-20个非常有用的程序片段
下面是20个非常有用的Java程序片段,希望能对你有用. 1.字符串有整型的相互转换 String a = String.valueOf(2); //integer to numeric string ...
- static类
静态类,用于类内部. 静态类,不需要创建父类对象,即可使用. 非静态类,需要先创建父类对象,才可使用. class A{ static class B1{} class B2{} } = new A ...
- csms发布步骤
1.wcf发布 通过点击 CSMS2.Application,右键发布按钮,将文件拷贝 2.打包文件 CSMS2.Resources 中 update.config 修改为对应 ServerUrl地址 ...
- 实现SQLServer数据库转成MYSQL数据库
1.首先需要下载安装工具Navicat Premium. 2.注意:将数据库移至本地SQLServer,我试过直接在局域网上其他SQLServer服务器上想转到本地Mysql好像有问题,想将远程数据库 ...