第十三章 java反射机制
1.如何创建Class的实例
1.1过程:源文件经过编译(javac.exe)后,得到一个或多个.class文件, .class文件经过运行(java.exe),就需要进行类的加载(通过JVM的类的加载器),记载到内存中的缓存,每一个放入缓存中的.class文件就是一个Class的实例
1.2Class的一个对象,对应着一个运行时类,相当于一个运行时类本身充当了Class的一个实例。
1.3java.long.Class是反射的源头。接下类涉及到反射的类都在java.long.reflect子包下。
1.4实例化Class的方法:
①调用运行时类的.class属性
Class clazz = Person.class
②通过运行时类的对象,调用其getClass()方法
Person p = new Person;
Class clazz = p.getClass();
③调用Class的静态方法forName(String className) 。此方法报ClassNotFoundException
String className = "person";
Class clazz = Class.forName(className);
2.有了Class实例以后,可以做什么
2.1创建对应的运行时类的对象
①调用无参构造器创建
Object obj = Class.newInstance();
Person p = (Person)obj;
②调用指定构造器创建(带参,非public--->Declared)
Constructor cons = clazz.getDeclaredConstuctor(形参类型.class,形参类型.class 等等);
cons.setAccessible(true);
Person p = (Person)cons.newInstance("Tom",10);
2.2调用查询获取对应的运行时类的完整的类的结构:属性、方法、构造器、包、父类、接口、泛型、注解、异常、内部类
如:Method[] m1 = clazz.getMethods();获取到对应的运行时类中声明的权限为public的方法(包含父类中声明的public方法)
Method[] m2 = clazz.getDeclaredMethods();获取到对应的运行时类中所有的方法(不含父类)
2.3调用对应的运行时类中指定的结构(某个指定的属性、方法、构造器)
①调用指定属性
非public属性:
Field f1 = clazz.getDeclaredField("name");//属性名
f1.setAccessible(true);
f1.set(a,“Jerry”);//对象 属性
public属性:
Field f2 = clazz.getField("age");//属性名
f2.set(a,9);//对象 属性
static属性:
Field f3 = clazz.getDeclaredField("desc");//属性名
f3.get(null/对象/类名.class);
②调用指定方法:
调用非public方法:
Method m1 = clazz.getDeclaredMethod("getAge");//方法名 形参类型
m1.setAccessible(true);
int age = (Integer)m1.invoke(p);//方法的返回值类型 名称 obj,args对象 形参或无
调用public方法:
Method m2 = clazz.getMethod("show",String.class);//方法名 形参类型
Object returnVal = m2.invoke(p,"帅哥");//对象 形参 返回值为方法的
调用static方法:
Method m3 = clazz.getDeclaredMethod("getAge");//方法名 形参类型
m3.setAccessible(true);
m3.invoke(p/Person.class/null);//对象 类 null
3.java动态代理
代理模式设计原理:使用一个代理将对象包装起来,然后用该代理对象取代原始对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时将方法调用转到
原始对象上
静态代理:要求被代理类和代理类同时实现相应的一套接口,通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的方法的调用。
动态代理:在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类,当调用代理类的实现的抽象方法时,就发起对被代理类同样的方法的调用
涉及到的技术点:
①提供一个实现了InvocationHandler接口实现类,并重写其invoke()方法
②Proxy.newInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),h);//obj:被代理类对象 h:实现了InvocationHandler接口实现类的对象
动态代理与AOP
第十四章 网络编程
1.要想实现网络传输,需要考虑的问题有哪些?
1.1如何才能准确的定位网络上的一台主机?
1.2如何才能进行可靠的、高效的数据传输?
2.Java如何实现的网络通信
2.1使用IP地址---定位一台主机 使用端口号---定位一个应用 ===>InetAddress类
如何创建一个InetAddress的对象?getByName(**);比如:InetAddress Inet = InetAddress.getByName(*192.168.10.165*);
如何创建本机的一个InetAddress的对象?getLocalHost()
域名:getHostName() IP:getHostAddress()
2.2对应有协议:
OSI参考模型:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
TCP/IP参考模型:应用层 传输层 网络层 物理+数据链路层
对于传输层而言:
TCP协议:
使用TCP协议前,须先建立TCP连接,形成传输数据通道
传输前,采用“三次握手”方式,是可靠的
TCP协议进行通信的两个应用进程:客户端、服务端
在连接中可进行大数据量的传输
传输完毕,需释放已建立的连接,效率低
UDP协议:
将数据、源、目的封装成数据包,不需要建立连接
每个数据报的大小限制在64K内
因无需连接,故是不可靠的
发送数据结束时无需释放资源,速度快
TCP的编程:Socket ServerSocket
例子:
1.客户端发送内容给服务端,服务端将内容打印到控制台上。
2.客户端发送内容给服务端,服务端给予反馈。
3.客户端发送内容给服务端,服务端保存到本地,并返回“发送成功”给客户端,并关闭相应的连接。
UDP的编程:DatagramSocket DatagramPacket
URL的编程:统一资源定位符 一个URL的对象,对应着互联网上的一个资源
我们可通过URL的对象调用其相应的方法,将此资源读取(“下载”)
本文出自 “阿成的博客” 博客,转载请与作者联系!
原文地址:http://fanyuecheng.blog.51cto.com/9529438/1589608