Java反刍小结

面向对象生命周期

对象生命周期:

【1】先初始化静态变量与静态代码块。同时存在,自上而下初始化;

      -ex:静态变量中存在new 当前对象,先执行构造函数,然后继续初始化,同理。     

【2】


深拷贝核心步骤:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream ops = new ObjectOutputStream(bos);
ops.writeObject(this);
//反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();


反射:

//获取反射三种方式:

A a = new A();
Class<? extends A> a1 = a.getClass();

Class<? extends A> a2 = A.class;

Class a3 = Class.forName("反射.A");

=======================================true

Class<?> aClass = B.class.asSubclass(A.class);

Class<? extends A> testClass = B.class;

========================================

//多态
I i = I.class.cast(new A());
i.show();
I i1 = I.class.cast(new B());
i1.show();

===================================


interface I{
     public void show();
}

class A implements I{
     @Override
     public void show() {
         System.out.println("A.show()");
     }
}

class B extends A{
     public void show() {
         System.out.println("B.show()");
     }
}

//获取所有属性

field.setAccessible(true);

-getDeclaredFields()

-field.get(person)


动态代理:

//绑定bind(obj)

public Object bind(Object object) {
        this.obj = object;
         return Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(), this.obj.getClass().getInterfaces(), this);
     }

// 代理

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
         // TODO Auto-generated method stub
         Object result  = method.invoke(obj, args);
         return result;
     }

// 示例

        Cal proxy = (Cal) dProxy.bind(cal);
         System.out.println(proxy.add(1, 3))


网络编程TCP:

//客户端

Socket socket = new Socket("127.0.0.1", 8080);

-socket.getOutputStream()

-DataOutputStream  writeUTF()

-socket.getInputStream()

-DataInputStream  readUTF()

//服务端

serverSocket = new ServerSocket(8080);

Socket socket = serverSocket.accept();

======================UDP协议

byte[] buf = new byte[1024];

// 发送端口:6600 从6080端口发送

InetAddress inetAddress = InetAddress.getByName("localhost");
datagramPacket = new DatagramPacket(buf1,buf1.length,inetAddress,6600);
datagramSocket = new DatagramSocket(6080);
datagramSocket.send(datagramPacket);

// 接受信息

        byte[] buf = new byte[1024];

DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
DatagramSocket datagramSocket;

datagramSocket = new DatagramSocket(6600);
datagramSocket.receive(datagramPacket);
String receive = new String(datagramPacket.getData());

datagramPacket = new DatagramPacket(buf1,buf1.length,datagramPacket.getSocketAddress());
datagramSocket.send(datagramPacket);



XML操作:

            Document document = reader.read("./src/test.xml");
             Element rootElement = document.getRootElement();
             Element newElement = rootElement.addElement("brand");
             newElement.addElement("name", "huawei");
             newElement.addAttribute("type", "mate");
            

//增加元素节点

SAXReader reader = new SAXReader();

Document document = reader.read("./src/test.xml");
Element rootElement = document.getRootElement();
Element newElement = rootElement.addElement("brand");
newElement.addElement("name", "huawei");
newElement.addAttribute("type", "mate");


//同步XML文件

OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
     XMLWriter writer = new XMLWriter(new FileWriter("./src/test.xml"), format);
     writer.write(document);
     writer.close();


//设置属性值

DocumentHelper.createAttribute(book, "id", "bk001");

book1.addAttribute("id", "bk002");
book1.addCDATA("test word2");


常规注解(内置)
     @Depricated     //标注已过时的注解
     @Override     -限定方法重写    //检查是否是重写方法、检查方法是否是父类的重写方法
     @SuppressWarning     //忽略警告
         @SuppressWarnings(unused)
元注解
     1.ElementType:提供注解的类型
     2.RetentionPolicy:用于声明注解的生命周期
         注解想要通过反射获取到,必须是RetentionPolicy.RUNTIME类型
        
     3.@Documented
         //其实可要可不要,是用于表面是否会出现在DOC注释里的
     4.@Target
         @Target(ElementType.TYPE)//可以没有,如果使用他,配合ElementType枚举类型,可以定义
             注解作用的地方 {CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE,
                 PARAMETER, TYPE}
     5.@Retention(RetentionPolicy.RUNTIME)//可以没有,如果有,可以用他来定义注解的作用周期
    
     6.@Inherited    表明注解是能被继承


异常抛出顺序:

try…catch捕获后,依次:try –> catch【此处不会返回去继续执行try异常之后的代码块】 --->finally –>继续执行后续代码块


多线程部分:

Java Thread中, join() 方法主要是让调用该方法的thread完成run方法里面的东西后, 再执行join()方法后面的代码。

线程Thread除了提供join()方法之外,还提供了join(long millis)和join(long millies,int nanos)两个具备超时特性的方法。这两个超时方法标识,如果线程thread在给定的超时时间里没有终止,那么将会从该超时方法中返回。

yield让步后,不一定不继续获取资源

// 加锁机制

private Lock lock = new ReentrantLock();

lock.lock();

lock.unlock();


//读写锁:控制多读,一个写

private ReadWriteLock lock = new ReentrantReadWriteLock();
private Lock readLock = lock.readLock();
private Lock writeLock = lock.writeLock();

readLock.lock();

readLock.unlock();

writeLock.lock();

writeLock.unlock();


集合中:

ArrayList: remove(int)  remove(obj)  removeAll()

LinkedList: +removeFirst() removeLast()  addFirst()   addLast()  getFirst()   getLast()



// 线程池 重写call()方法,调用get()方法

        ExecutorService pool = Executors.newFixedThreadPool(2);
         //重写call()方法,调用f.get()方法
         Future<String> f = pool.submit(new Callable<String>() {
             @Override
             public String call() throws Exception {
                 Thread.sleep(1000);
                 return "myCall";
             }
         });
         try {
             System.out.println(f.get());
             pool.shutdown();
             System.out.println("end");

       }



A.class.getResource("/").getPath()  //获取当前类所在得src目录





数据库操作类型:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL

数据定义语言DDL:CREATE TABLE/VIEW/INDEX/SYN/CLUSTER

数据操纵语言DML主要有三种形式:

–1) 插入:INSERT
–2) 更新:UPDATE
–3) 删除:DELETE数据查

询语言DQL(data query language)基本结构
–1)选择:SELECT子句
4. 数据控制语言DCL
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
—-回滚—ROLLBACK
—-回滚命令使数据库状态回到上次最后提交的状态。其格式为:
——SQL>ROLLBACK;
3) COMMIT [WORK]:提交。


事务提交的三种方式:

(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:
SQL>COMMIT;

(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
系统将自动进行提交,这就是自动提交。其格式为:
SQL>SET AUTOCOMMIT ON;

路径问题:

  • .getClass().getResource(fileName) :表示只会在当前调用类所在的同一路径下查找该fileName文件;
  • .getClass().getClassLoader().getResource(fileName):表示只会在根目录下(/)查找该文件;
  • fileName如果是前面加“/”,如"/fileName",则表示绝对路径,取/目录下的该文件;
    如果是前面没有加“/”,如"fileName",则表示相对路径,取与调用类同一路径下的该文件。
  • 如果路径中包含包名 ,getClass().getResource("com/xxx/1.xml");
    包名的层级使用"/"隔开(正斜杠),而非“.”(半角句号)。

  • XMLAPI整理汇总:

    table.attributeValue("name");

    tableNew.addAttribute("name", tname);

    Document document = reader.read(file);

    Element root = document.getRootElement();

    List<Element> tables = root.elements("table");

    Element tableNew = DocumentHelper.createElement("table");

    posted @ 2020-06-11 14:39  小海_macro  阅读(203)  评论(0编辑  收藏  举报