Skip to content

Commit 6478081

Browse files
committed
first commit
0 parents  commit 6478081

15 files changed

+2974
-0
lines changed

README.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# 我的java学习笔记
2+
3+
笔记分为两大部分:javase和javaweb
4+
5+
- [javase]((#/javase))
6+
- [javaweb](#/javaweb)
7+
8+
9+
笔记内容主要是对一些基础特性和编程细节进行总结整理,适合了解java基础语法,想进一步深入学习的人
10+
11+
12+
-----
13+
14+
# 目录
15+
16+
- [javase](#/javase)
17+
- [java基础巩固笔记(1)-反射.md](#/javase/java基础巩固笔记(1)-反射.md)
18+
- [java基础巩固笔记(2)-泛型.md](#/javase/java基础巩固笔记(2)-泛型.md)
19+
- [java基础巩固笔记(3)-类加载器.md](#/javase/java基础巩固笔记(3)-类加载器.md)
20+
- [java基础巩固笔记(4)-代理.md](#/javase/java基础巩固笔记(4)-代理.md)
21+
- [java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md](#/javase/java基础巩固笔记(4)-实现AOP功能的封装与配置的小框架.md)
22+
- [java基础巩固笔记(5)-多线程之传统多线程.md](#/javase/java基础巩固笔记(5)-多线程之传统多线程.md)
23+
- [java基础巩固笔记(5)-多线程之共享数据.md](#/javase/java基础巩固笔记(5)-多线程之共享数据.md)
24+
- [java基础巩固笔记(5)-多线程之线程并发库.md](#/javase/java基础巩固笔记(5)-多线程之线程并发库.md)
25+
- [javaweb](#/javaweb)
26+
- [javaweb入门笔记(1)-Tomcat.md](#/javaweb/javaweb入门笔记(1)-Tomcat.md)
27+
- [javaweb入门笔记(2)-http入门.md](#/javaweb/javaweb入门笔记(2)-http入门.md)
28+
- [javaweb入门笔记(3)-Servlet.md](#/javaweb/javaweb入门笔记(3)-Servlet.md)
29+
- [javaweb入门笔记(4)-request和response.md](#/javaweb/javaweb入门笔记(4)-request和response.md)
30+
- [javaweb入门笔记(5)-cookie和session.md](#/javaweb/javaweb入门笔记(5)-cookie和session.md)
31+
- [javaweb入门笔记(6)-JSP技术.md](#/javaweb/javaweb入门笔记(6)-JSP技术.md)
32+
33+
34+
-----
35+
36+
# 联系作者
37+
38+
- [Brian's Personal Website](http://brianway.github.io/)
39+
- [oschina](http://my.oschina.net/brianway)
40+
- [CSDN](http://blog.csdn.net/h3243212/)
41+
42+
43+
44+
**all copyright reserved**
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
# java基础巩固笔记(1)-反射
2+
3+
标签: java
4+
5+
---
6+
7+
**Contents**
8+
9+
- [java基础巩固笔记(1)-反射](#java基础巩固笔记1-反射)
10+
- [反射](#反射)
11+
- [反射基本使用](#反射基本使用)
12+
- [数组的反射](#数组的反射)
13+
- [配置文件加载](#配置文件加载)
14+
-[内省(Instropector) & JavaBean](#内省instropector--javabean)
15+
16+
17+
18+
---
19+
20+
# 反射
21+
22+
**反射:将类的属性和方法映射成相应的类。**
23+
24+
## 反射基本使用
25+
26+
获取Class类的三种方法:
27+
28+
- 类名.class
29+
- 对象名.getClass()
30+
- Class.forName("要加载的类名")
31+
32+
根据API写就行了,大致流程就是:
33+
34+
- 用上述三种方式之一获取特定类的`Class`类,即该类对应的字节码
35+
- 调用`Class`对象的`getConstructor(Class<?>... parameterTypes)`获取构造方法对象
36+
- 调用是构造方法类`Constructor``newInstance(Object... initargs)`方法新建对象
37+
- 调用`Class`对象的`getMethod(String name, Class<?>... parameterTypes)`获取方法对象
38+
- 调用方法对象类`Method``invoke(Object obj, Object... args)`方法,调用对象上相应方法
39+
40+
*用方法的参数类型唯一标识一个方法,依据:方法的重载*
41+
42+
43+
## 数组的反射
44+
下面这个例子主要说明几点:
45+
46+
- 对于元素同类型的数组,同维数组,class一样
47+
- 不同维,class不同
48+
- 不同维的,父类都是Object,一样
49+
- 基本类型一维数组不能直接转换为Object[]
50+
- `java.util.Arrays``asList`方法API看看
51+
52+
```java
53+
public class ReflectTest {
54+
public static void main(String[] args) {
55+
int [] a1 = new int[]{1,2,3};
56+
int [] a2 = new int[5];
57+
int [][] a3 = new int[2][3];
58+
System.out.println(a1.getClass() == a2.getClass());//true
59+
System.out.println(a1.getClass());//class [I
60+
System.out.println(a3.getClass());//class [[I
61+
System.out.println(a1.getClass().getSuperclass() == a3.getClass().getSuperclass());//true
62+
System.out.println(a2.getClass().getSuperclass());//class java.lang.Object
63+
64+
//下句编译不通过:Error:(15, 42) java: 不可比较的类型: java.lang.Class<capture#1, 共 ? extends int[]>和java.lang.Class<capture#2, 共 ? extends int[][]>
65+
//System.out.println(a1.getClass() == a3.getClass());
66+
67+
Object []b3 = a3;//通过
68+
//下句编译不通过 Error:(17, 24) java: 不兼容的类型: int[]无法转换为java.lang.Object[]
69+
//Object [] b1 = a1;
70+
71+
String s1 = "abc";
72+
System.out.println(Arrays.asList(a1));//[[I@1540e19d]
73+
System.out.println(Arrays.asList(s1));//[abc]
74+
}
75+
}
76+
```
77+
78+
79+
80+
输出:
81+
82+
```
83+
true
84+
class [I
85+
class [[I
86+
true
87+
class java.lang.Object
88+
[[I@1540e19d]
89+
[abc]
90+
```
91+
92+
乱入:
93+
hashcode与内存泄露问题
94+
参考java api:
95+
96+
>* hashcode一旦生成,不要变
97+
>* 对象equals方法返回true,则hascode要一致
98+
>* 反之,equals方法返回false,hascode不一定互异
99+
100+
如果参与hascode计算的成员变量中途发生变化,则后面remove时失败,造成内存泄露
101+
102+
103+
----
104+
105+
## 配置文件加载
106+
107+
- 类加载器加载只读配置文件
108+
109+
`类名.class.getClassLoader().getResourceAsStream(str);`
110+
111+
- 类名.class.getResourceAsStream(str),实质还是调用类加载器。
112+
源码截取(java.lang包下的Class.java):
113+
114+
```java
115+
public InputStream getResourceAsStream(String name) {
116+
name = resolveName(name);
117+
ClassLoader cl = getClassLoader0();
118+
if (cl==null) {
119+
// A system class.
120+
return ClassLoader.getSystemResourceAsStream(name);
121+
}
122+
return cl.getResourceAsStream(name);
123+
}
124+
```
125+
126+
关于路径str,写法有点讲究。
127+
128+
- 不加斜杠,相对路径:
129+
`str = "config.properties";`
130+
- 加斜杠,从classpath的根路径找:
131+
`str = "/org/iot/ui/config.properties";`
132+
133+
*以前编译java代码时,有些`conf/`文件夹还要添加进依赖或者标记成source文件夹,里面明明都是xml文件,没Java源码。从这里,我现在知道了,是使用反射加载配置文件的缘故*
134+
135+
---
136+
137+
## 内省(Instropector) & JavaBean
138+
JavaBean读取属性x的值的流程:变大写、补前缀、获取方法。
139+
140+
```
141+
"x"-->"X"-->"getX"-->"MethodGetX"
142+
```
143+
144+
- 自己用内省操作
145+
146+
我目前没用上,所以不贴代码了,只附上核心类
147+
148+
简单实现:
149+
使用`java.beans.PropertyDescriptor`
150+
151+
麻烦实现:
152+
使用`java.beans.Introspector`类,遍历`getBeanInfo`方法的返回值
153+
154+
**JavaBean必须有一个不带参数的构造函数**
155+
156+
- 使用BeanUtils工具包
157+
158+
- 字符串和整数转换(对比(PropertyUtils)
159+
- 属性级联操作
160+
- 操作map
161+
162+
163+
164+
[作者更多文章:@brianway](http://brianway.github.io/)
165+
166+
167+
168+
169+
170+
171+
172+
173+
174+
175+
176+
177+
178+
179+
180+
181+
182+

0 commit comments

Comments
 (0)