反射练习 1>map转换为对象:
2>文件中的信息排序后输出
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setGae(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", gae=" + age +
'}';
}
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class StudentRe {
public static void main(String[] args) throws Exception {
testStart();
test1Start();
}
public static void testStart() throws Exception {
Map<String,Object>map=new HashMap<>();
map.put("name","李四");
map.put("age",18);
Class clazz=Student.class;
Student student=(Student) test(map,clazz);
System.out.println(student);
}
public static void test1Start() throws Exception {
Reader reader=new FileReader("D:\\MyJavaMaven\\untitled1\\src\\hhh");
BufferedReader bufferedReader=new BufferedReader(reader);
ArrayList list=new <Student>ArrayList();
String s="";
while ((s=bufferedReader.readLine())!=null){
Student student= (Student) test1(s);
list.add(student);
}
System.out.println(list);
}
public static Object test(Map map,Class clazz) throws Exception {
Iterator<Map.Entry<String,Object>> iterator=map.entrySet().iterator();
Object obj=clazz.newInstance();
while (iterator.hasNext()){
Map.Entry<String,Object> entry=iterator.next();
String name=entry.getKey();
Object value=entry.getValue();
Field field=clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(obj,value);
}
return obj;
}
public static Object test1(String s) throws Exception {
int index=s.indexOf("=");
if(index!=-1){
String ClassName=s.substring(0,index);
Class<?> clazz=Class.forName(ClassName);
Object obj=clazz.newInstance();
String filedValue=s.substring(index+1);
String[]array=filedValue.split(",");
for(int i=0;i<array.length;i++){
String[]arrayValue=array[i].split(":");
Field field=clazz.getDeclaredField(arrayValue[0]);
field.setAccessible(true);
Class type =field.getType();
if (type.getTypeName().equals("int")){
field.set(obj,Integer.parseInt(arrayValue[1]));
}else {
field.set(obj,arrayValue[1]);
}
}
return obj;
}
return null;
}
}
txt文件:Student=name:大黄,age:10
知识内容【注解、枚举、反射、网络编程】 注解:从jdk5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。 Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具,开发工具和部署工具,可以通过这些补充信息进行验证或者进行部署。 Annotation可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的“name=value”对中 常见注解 @override:限定重写父类方法,该注解只能用于方法 @Deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或者存在更好的选择 @SupperssWarnings:抑制编译器警告
2.枚举 当需要定义一组常量时,强烈建议使用枚举类 枚举类的实现JDK1.5之前需要自定义枚举类,JDK1.5新增的enum关键字用于定义枚举类。 若枚举只有一个对象,则可以作为一种单例模式的实现方式。 枚举类的属性 枚举类对象的属性不应允许被改动**,**所以应该使用private final修饰。 枚举类使用private final修饰的属性应该在构造器中为其赋值若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数 反射: Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作对象的内部属性及方法。 加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。 动态语言 是一类在运行时可以改变其结构的预言:例如新的函数,对象,甚至代码可以被引进,已有的函数可以被删除或者 是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。主要动态语言:Object-c,C#,javaScript,PHP,Python,Erlang。 静态语言与动态语言相对应,运行时结构不可变的语言就是静态语言。如Java,C,C++。 Java不是动态语言,但Java可以称为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制,字节码操作获得类似动态语言的特性。Java的动态性让编程的时候更加灵活! Java反射机制提供的功能: 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时获取泛型信息 在运行时调用任意一个对象的成员变量和方法 在运行时处理注解 生成动态代理 反射机制主要ApI java.lang.Class:一个获取类的信息的工具类 java.lang.reflect.Method:代表类的方法 java.lang.reflect.Filed:代表类的成员变量 java,lang.reflect.Constructor;代表类的构造器 1.Class类 在Object类中定义了以下的方法,此方法将被所有子类继承 以上的方法返回值的类型是一个Class类,此类是Java反射的源头,实际上所谓反射从程序的运行结构来看也很好理解,即:可以通过对象反射求出类的名称。 Class类:某个类的属性,方法和构造器,某个类到底实现了那些接口。对于每个类而言,jre都为其保留一个不变的Class类型的对象。一个Class对象包含特定某个结构 Class本身也是一个类。Class对象只能由系统建立对象 一个加载的类再JVM中只会由一个Class实例。一个Class对象对应一个加载到JVM中的要给.class文件。 每个类的实例都会记得自己是由那个Class实例所生成。 通过Class可以完整得到一个类中的所有被加载的结构 Class类是Reflection的根源,针对任何你想动态加载,运行的类,必须先获取相应的Class对象。 获取Class对象的方法: 1、Class calzz=Person.class 方法可靠,性能最高 2、Person person=new Person(); Class calzz=person.getClass(); 3、Class calzz=Class.forName();最常用的方法 类的加载与ClassLoader的理解 类的加载:将类的class文件读入内存,并为之创建和一个java.lang.Class对象,该过程由类加载器完成 类的链接:将类的二进制数据合并到jre中。 网络编程 Java是Internet上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库,可以实现无缝的网络连接,联网的底层细节被隐藏在Java的本机安装系统里,由JVM进行控制。并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。 网络编程的目的就是指直接或间接地通过网络协议与其它计算机进行通讯。 网络编程中有两个主要的问题: 如何准确地定位网络上地ip,找到主机后如何可靠高效地进行数据传输。 OSI参考模型:模型过于理想化,未能广泛推广 TCP/IP参考模型(TCP/IP协议):事实上地国际标准。 Tcp/ip协议模型从更实用地角度出发。 传输层协议中有两个非常重要地协议: 传输控制协议:TCP 用户数据报协议:UDP 传输控制协议TCP是面向连接地传输层协议。即应用进程在使用TCP协议之前,先建立起TCP连,在传输完毕后,释放已经建立的连接。利用TCP协议进行通信的两个应用进程,一个是服务器进程,另一个是客户端进程。 用户数据报协议UDP是面向无连接的运输层协议。即应用进程在使用UDP之前,不比先建立连接。自然,发送数据结束时也没有连接需要释放。因此,减少了开销和发送数据之前的时延。 InetAddress简介 InetAddress类对象含有一个internet主机地址的域名和IP地址。 端口号:标识正在计算机上运行的进程。公认端口:0-1023.注册端口:1024-49151. TCP程序设计:客户端-服务器模型是最常见的网络应用程序模型。 IP地址标识internet上的计算机,端口号标识正在计算机上运行的进程(程序)。 端口号与IP地址的组合得出一个网络套接字。 端口号被规定为一个16位的整数0~65535。其中,0-1023被预先定义的服务通信占用(telnet 23,http 80)。除非我们需要访问这些特定服务,否则,就应该使用1024-65535这些端口中的某一个进行通信,以免发生端口冲突。 利用套接字(Socket)接口开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。套接字能执行7种操作: 连接到远程主机 绑定到端口 接收从远程机器的连接请求 监听到达的数据 发送数据 接收数据 关闭连接 Socket简介 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链表的一段称为一个Socket(套接字)。Socket通常用来实现Client/Server连接。 Java语言的基于套接字编程分为服务器编程和客户端编程。
|