Java中的反射,枚舉及l(fā)ambda表達(dá)式的使用詳解
一、反射
1.1 定義
Java的反射(reflection)機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性,既然能拿到,那么我們就可以修改部分類型信息;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語(yǔ)言的反射(reflection)機(jī)制。
1.2 用途
1、在日常的第三方應(yīng)用開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到某個(gè)類的某個(gè)成員變量、方法或是屬性是私有的或是只對(duì)系統(tǒng)應(yīng)用開(kāi)放,這時(shí)候就可以利用Java的反射機(jī)制通過(guò)反射來(lái)獲取所需的私有成員或是方法 。
2、反射最重要的用途就是開(kāi)發(fā)各種通用框架,比如在spring中,我們將所有的類Bean交給spring容器管理,無(wú)論是XML配置Bean還是注解配置,當(dāng)我們從容器中獲取Bean來(lái)依賴注入時(shí),容器會(huì)讀取配置,而配置中給的就是類的信息,spring根據(jù)這些信息,需要?jiǎng)?chuàng)建哪些Bean,spring就動(dòng)態(tài)的創(chuàng)建這些類。
1.3 反射基本信息
Java程序中許多對(duì)象在運(yùn)行時(shí)會(huì)出現(xiàn)兩種類型:運(yùn)行時(shí)類型(RTTI)和編譯時(shí)類型,例如Person p = newStudent();這句代碼中p在編譯時(shí)類型為Person,運(yùn)行時(shí)類型為Student。程序需要在運(yùn)行時(shí)發(fā)現(xiàn)對(duì)象和類的真實(shí)信息。而通過(guò)使用反射程序就能判斷出該對(duì)象和類屬于哪些類。
1.4 與反射相關(guān)的類
| 類名 | 用途 |
|---|---|
| Class類 | 代表類的實(shí)體,在運(yùn)行的Java應(yīng)用程序中表示類和接口 |
| Field類 | 代表類的成員變量/類的屬性 |
| Method類 | 代表類的方法 |
| Constructor類 | 代表了類的構(gòu)造方法 |
1.5 Class類(反射機(jī)制的起源 )
Class代表類的實(shí)體,在運(yùn)行的Java應(yīng)用程序中表示類和接口 .
Java文件被編譯后,生成了.class文件,JVM此時(shí)就要去解讀.class文件 ,被編譯后的Java文件.class也被JVM解析為一個(gè)對(duì)象,這個(gè)對(duì)象就是 java.lang.Class .這樣當(dāng)程序在運(yùn)行時(shí),每個(gè)類文件就最終變成了Class類對(duì)象的一個(gè)實(shí)例。我們通過(guò)Java的反射機(jī)制應(yīng)用到這個(gè)實(shí)例,就可以去獲得甚至去添加改變這個(gè)類的屬性和動(dòng)作,使得這個(gè)類成為一個(gè)動(dòng)態(tài)的類 .
1.6 Class類中的相關(guān)方法
常用獲得類相關(guān)的方法:
| 方法 | 用途 |
|---|---|
| getClassLoader() | 獲得類的加載器 |
| getDeclaredClasses() | 返回一個(gè)數(shù)組,數(shù)組中包含該類中所有類和接口類的對(duì)象(包括私有的) |
| forName(String className) | 根據(jù)類名返回類的對(duì)象 |
| newInstance() | 創(chuàng)建類的實(shí)例 |
| getName() | 獲得類的完整路徑名字 |
常用獲得類中屬性相關(guān)的方法(以下方法返回值為Field相關(guān))
| 方法 | 用途 |
|---|---|
| getField(String name) | 獲得某個(gè)公有的屬性對(duì)象 |
| getFields() | 獲得某個(gè)公有的屬性對(duì)象 |
| getDeclaredField(String name) | 獲得某個(gè)屬性對(duì)象 |
| getDeclaredFields() | 獲得某個(gè)屬性對(duì)象 |
獲得類中注解相關(guān)的方法:
| 方法 | 屬性 |
|---|---|
| getAnnotation(Class annotationClass) | 返回該類中與參數(shù)類型匹配的公有注解對(duì)象 |
| getAnnotations() | 返回該類所有的公有注解對(duì)象 |
| getDeclaredAnnotation(Class annotationClass) | – |
| getDeclaredAnnotations() | 返回該類所有的注解對(duì)象 |
獲得類中構(gòu)造器相關(guān)的方法(以下方法返回值為Constructor相關(guān))
| 方法 | 屬性 |
|---|---|
| getConstructor(Class…<?> parameterTypes) | 獲得該類中與參數(shù)類型匹配的公有構(gòu)造方法 |
| getConstructors() | 獲得該類的所有公有構(gòu)造方法 |
| getDeclaredConstructor(Class…<?> parameterTypes) | 獲得該類中與參數(shù)類型匹配的構(gòu)造方法 |
| getDeclaredConstructors() | 獲得該類中所以構(gòu)造方法 |
1.7 獲得Class對(duì)象的三種方式
在反射之前,我們需要做的第一步就是先拿到當(dāng)前需要反射的類的Class對(duì)象,然后通過(guò)Class對(duì)象的核心方法,達(dá)到反射的目的,即:在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性,既然能拿到,那么我們就可以修改部分類型信息。
第一種,使用 Class.forName("類的全路徑名"); 靜態(tài)方法。
前提:已明確類的全路徑名。
第二種,使用 .class 方法。
說(shuō)明:僅適合在編譯前就已經(jīng)明確要操作的 Class。
第三種,使用類對(duì)象的 getClass() 方法。
代碼示例:
本節(jié)代碼均在一個(gè)包下面。
package reflectTest;
class Student{
//私有屬性name
private String name = "bit";
//公有屬性age
public int age = 18;
//不帶參數(shù)的構(gòu)造方法
public Student(){
System.out.println("Student()");
}
private Student(String name,int age) {
this.name = name;
this.age = age;
System.out.println("Student(String,name)");
}
private void eat(){
System.out.println("i am eat");
}
public void sleep(){
System.out.println("i am pig");
}
private void function(String str) {
System.out.println(str);
} @
Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class test01 {
public static void main(String[] args) {
try {
//通過(guò) Class 對(duì)象的 forName() 靜態(tài)方法來(lái)獲取,用的最多,
//但可能拋出 ClassNotFoundException 異常
Class<?> c1 = Class.forName("reflectTest.Student");
//直接通過(guò) 類名.class 的方式得到,該方法最為安全可靠,程序性能更高
//這說(shuō)明任何一個(gè)類都有一個(gè)隱含的靜態(tài)成員變量 class
Class<?> c2 = Student.class;
//通過(guò)getClass獲取Class對(duì)象
Student student = new Student();
Class<?> c3 = student.getClass();
System.out.println(c1.equals(c2));
System.out.println(c1.equals(c3));
System.out.println(c2.equals(c3));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
輸出結(jié)果:

1.8 反射的使用
package reflectTest;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 通過(guò)class類的newInstance方法獲取類的實(shí)例
*/
public class ReflectClassDemo {
public static void reflectNewInstance(){
try {
//獲得Class對(duì)象
Class<?> c1 = Class.forName("reflectTest.Student");
//創(chuàng)建類的實(shí)例
Student student = (Student) c1.newInstance();
System.out.println(student);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
/**
* 反射私有的構(gòu)造方法
*/
public static void reflectPrivateConstructor() {
try {
Class<?> c1 = Class.forName("reflectTest.Student");
//構(gòu)造方法
Constructor<?> constructor = c1.getDeclaredConstructor(String.class,int.class);
//設(shè)置為true后可修改訪問(wèn)權(quán)限
constructor.setAccessible(true);
Student student = (Student) constructor.newInstance("world",18);
System.out.println(student);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 反射私有屬性
*/
public static void reflectPrivateField() {
try {
Class<?> c1 = Class.forName("reflectTest.Student");
Student student = (Student) c1.newInstance();
Field field = c1.getDeclaredField("name");
field.setAccessible(true);
field.set(student,"zhang");
System.out.println(student);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
// 反射私有方法
public static void reflectPrivateMethod() {
try {
Class<?> c1 = Class.forName("reflectTest.Student");
Student student = (Student) c1.newInstance();
Method method = c1.getDeclaredMethod("function",String.class);
method.setAccessible(true);
method.invoke(student,"我是私有的方法的參數(shù)");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// reflectNewInstance();
// reflectPrivateConstructor();
// reflectPrivateField();
reflectPrivateMethod();
}
}
1.9 反射優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
1.對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法
2.增加程序的靈活性和擴(kuò)展性,降低耦合性,提高自適應(yīng)能力
3.反射已經(jīng)運(yùn)用在了很多流行框架如:Struts、Hibernate、Spring 等等。
缺點(diǎn):
1.使用反射會(huì)有效率問(wèn)題。會(huì)導(dǎo)致程序效率降低。
2.反射技術(shù)繞過(guò)了源代碼的技術(shù),因而會(huì)帶來(lái)維護(hù)問(wèn)題。反射代碼比相應(yīng)的直接代碼更復(fù)雜 。
二、枚舉
枚舉的主要用途是:將一組常量組織起來(lái),在這之前表示一組常量通常使用定義常量的方式:
public static int final RED = 1; public static int final GREEN = 2; public static int final BLACK = 3;
但是常量舉例有不好的地方,例如:可能碰巧有個(gè)數(shù)字1,但是他有可能誤會(huì)為是RED,現(xiàn)在我們可以直接用枚舉來(lái)進(jìn)行組織,這樣一來(lái),就擁有了類型,枚舉類型。而不是普通的整形1。
代碼示例:
package enumTest;
public enum test01 {
RED,BLACK,GREEN,WHITE;
public static void main(String[] args) {
// System.out.println(test01.BLACK);
// System.out.println(BLACK);
test01 te = test01.BLACK;
switch (te) {
case RED:
System.out.println("red");
break;
case BLACK:
System.out.println("black");
break;
case WHITE:
System.out.println("white");
break;
case GREEN:
System.out.println("green");
break;
default:
break;
}
}
}
輸出結(jié)果:

優(yōu)點(diǎn):將常量組織起來(lái)統(tǒng)一進(jìn)行管理;
場(chǎng)景:錯(cuò)誤狀態(tài)碼,消息類型,顏色的劃分,狀態(tài)機(jī)等等…
本質(zhì):是 java.lang.Enum 的子類,也就是說(shuō),自己寫(xiě)的枚舉類,就算沒(méi)有顯示的繼承 Enum ,但是其默認(rèn)繼承了這個(gè)類。
2.1 Enum 類的常用方法
| 方法名稱 | 描述 |
|---|---|
| values() | 以數(shù)組形式返回枚舉類型的所有成員 |
| ordinal() | 獲取枚舉成員的索引位置 |
| valueOf() | 將普通字符串轉(zhuǎn)換為枚舉實(shí)例 |
| compareTo() | 比較兩個(gè)枚舉成員在定義時(shí)的順序 |
values()代碼示例 :
public enum test01 {
RED,BLACK,GREEN,WHITE;
public static void main(String[] args) {
test01[] te = test01.values();
for (int i = 0; i < te.length; i++) {
System.out.println(te[i]);
}
}
}
輸出結(jié)果:

ordinal() 代碼示例:
public enum test01 {
RED,BLACK,GREEN,WHITE;
public static void main(String[] args) {
test01[] te = test01.values();
for (int i = 0; i < te.length; i++) {
System.out.println(te[i] + " --> " + te[i].ordinal());
}
}
}
輸出結(jié)果:

valueOf() 、compareTo() 代碼示例:
public enum test01 {
RED,BLACK,GREEN,WHITE;
public static void main(String[] args) {
//把字符串變成對(duì)應(yīng)的枚舉對(duì)象
test01 te = test01.valueOf("RED");
System.out.println(te);
System.out.println(RED.compareTo(GREEN));//-2
System.out.println(BLACK.compareTo(RED));//1
}
}
輸出結(jié)果:

枚舉的構(gòu)造方法默認(rèn)是私有的
public enum test01 {
//枚舉對(duì)象
RED("red",1),BLACK(),GREEN(),WHITE();
public String color;
public int ordinal;
//private 加或者不加其都是私有的
test01(String color, int ordinal) {
this.color = color;
this.ordinal = ordinal;
}
//無(wú)參構(gòu)造
test01(){
}
}
2.2 枚舉的優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):
1.枚舉常量更簡(jiǎn)單安全 。
2.枚舉具有內(nèi)置方法 ,代碼更優(yōu)雅。
缺點(diǎn):
1.不可繼承,無(wú)法擴(kuò)展。
- 枚舉非常安全,不能通過(guò)反射,拿到實(shí)例對(duì)象。
- 枚舉本身就是一個(gè)類,其構(gòu)造方法默認(rèn)為私有的,且都是默認(rèn)繼承于
java.lang.Enum - 枚舉可以避免反射和序列化問(wèn)題
三、Lambda 表達(dá)式
Lambda表達(dá)式是Java SE 8中一個(gè)重要的新特性。lambda表達(dá)式允許你通過(guò)表達(dá)式來(lái)代替功能接口。 lambda表達(dá)式就和方法一樣,它提供了一個(gè)正常的參數(shù)列表和一個(gè)使用這些參數(shù)的主體(body,可以是一個(gè)表達(dá)式或一個(gè)代碼塊)。 Lambda 表達(dá)式(Lambda expression)可以看作是一個(gè)匿名函數(shù),基于數(shù)學(xué)中的λ演算得名,也可稱為閉包(Closure)。
3.1 Lambda表達(dá)式的語(yǔ)法及基本使用
基本語(yǔ)法: (parameters) -> expression 或 (parameters) ->{ statements; }
Lambda表達(dá)式由三部分組成:
1.paramaters:類似方法中的形參列表,這里的參數(shù)是函數(shù)式接口里的參數(shù)。這里的參數(shù)類型可以明確的聲明也可不聲明而由JVM隱含的推斷。另外當(dāng)只有一個(gè)推斷類型時(shí)可以省略掉圓括號(hào)。
2.->:可理解為“被用于”的意思
3.方法體:可以是表達(dá)式也可以代碼塊,是函數(shù)式接口里方法的實(shí)現(xiàn)。代碼塊可返回一個(gè)值或者什么都不反回,這里的代碼塊等同于方法的方法體。如果是表達(dá)式,也可以返回一個(gè)值或者什么都不返回。
// 1. 不需要參數(shù),返回值為 2 () -> 2 // 2. 接收一個(gè)參數(shù)(數(shù)字類型),返回其2倍的值 x -> 2 * x // 3. 接受2個(gè)參數(shù)(數(shù)字),并返回他們的和 (x, y) -> x + y // 4. 接收2個(gè)int型整數(shù),返回他們的乘積 (int x, int y) -> x * y // 5. 接受一個(gè) string 對(duì)象,并在控制臺(tái)打印,不返回任何值(看起來(lái)像是返回void) (String s) -> System.out.print(s)
代碼示例:
package lambdaTest;
@FunctionalInterface
//函數(shù)式接口
interface NoParameterNoReturn {
//注意:只能有一個(gè)方法
void test();
}
//無(wú)返回值一個(gè)參數(shù)
@FunctionalInterface
interface OneParameterNoReturn {
void test(int a);
}
//無(wú)返回值多個(gè)參數(shù)
@FunctionalInterface
interface MoreParameterNoReturn {
void test(int a,int b);
}
//有返回值無(wú)參數(shù)
@FunctionalInterface
interface NoParameterReturn {
int test();
}
//有返回值一個(gè)參數(shù)
@FunctionalInterface
interface OneParameterReturn {
int test(int a);
}
//有返回值多參數(shù)
@FunctionalInterface
interface MoreParameterReturn {
int test(int a,int b);
}
public class test01 {
public static void main(String[] args) {
// {} return 可以省略
NoParameterReturn noParameterReturn = ()->{return 10;};
int ret = noParameterReturn.test();
System.out.println(ret);//10
//()可以省略
OneParameterReturn oneParameterReturn = (a) -> a;
System.out.println(oneParameterReturn.test(10));//10
MoreParameterReturn moreParameterReturn = (a,b) -> a+b;
System.out.println(moreParameterReturn.test(1,2));//3
}
public static void main3(String[] args) {
//() {} 可省略
OneParameterNoReturn oneParameterNoReturn = (a)-> System.out.println(a);
oneParameterNoReturn.test(10);//10
//int類型可以省略
MoreParameterNoReturn moreParameterNoReturn = (a,b)-> System.out.println(a+b);
moreParameterNoReturn.test(10,20);//30
}
public static void main2(String[] args) {
NoParameterNoReturn noParameterNoReturn = () -> System.out.println("重寫(xiě)方法");
noParameterNoReturn.test();
}
public static void main1(String[] args) {
NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn(){
public void test(){
System.out.println("重寫(xiě)方法");
}
};
noParameterNoReturn.test();
}
}
3.2 函數(shù)式接口
函數(shù)式接口定義:一個(gè)接口有且只有一個(gè)抽象方法 。
注意:
1.如果一個(gè)接口只有一個(gè)抽象方法,那么該接口就是一個(gè)函數(shù)式接口。
2.如果我們?cè)谀硞€(gè)接口上聲明了 @FunctionalInterface 注解,那么編譯器就會(huì)按照函數(shù)式接口的定義來(lái)要求該接口,這樣如果有兩個(gè)抽象方法,程序編譯就會(huì)報(bào)錯(cuò)的。所以,從某種意義上來(lái)說(shuō),只要你保證你的接口中只有一個(gè)抽象方法,你可以不加這個(gè)注解。加上就會(huì)自動(dòng)進(jìn)行檢測(cè)的。
代碼示例:
@FunctionalInterface
//函數(shù)式接口
interface NoParameterNoReturn {
//注意:只能有一個(gè)方法
void test();
}
public static void main1(String[] args) {
NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn(){
public void test(){
System.out.println("重寫(xiě)方法");
}
};
noParameterNoReturn.test();
}
}
3.3 變量捕獲
Lambda 表達(dá)式中存在變量捕獲 ,了解了變量捕獲之后,我們才能更好的理解Lambda 表達(dá)式的作用域 。Java當(dāng)中的匿名類中,會(huì)存在變量捕獲。
package lambdaTest;
class Test {
public void func(){
System.out.println("func()");
}
}
public class test02 {
public static void main(String[] args) {
int a = 100;
new Test(){
@Override
public void func() {
System.out.println("我是內(nèi)部類,且重寫(xiě)了func這個(gè)方法!");
System.out.println("捕獲遍歷" + a);//能捕獲到的變量,要么是常量,要么未發(fā)生改變過(guò)。
}
};
}
}
Lambda表達(dá)式的優(yōu)點(diǎn)很明顯,在代碼層次上來(lái)說(shuō),使代碼變得非常的簡(jiǎn)潔。缺點(diǎn)也很明顯,代碼不易讀。
優(yōu)點(diǎn):
代碼簡(jiǎn)潔,開(kāi)發(fā)迅速;方便函數(shù)式編程;非常容易進(jìn)行并行計(jì)算;Java 引入 Lambda,改善了集合操作;
缺點(diǎn):
代碼可讀性變差;在非并行計(jì)算中,很多計(jì)算未必有傳統(tǒng)的 for 性能要高;不容易進(jìn)行調(diào)試;
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SSM框架整合之Spring+SpringMVC+MyBatis實(shí)踐步驟
大家都知道Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,本文主要介紹三大框架的整合包含spring和mybatis的配置文件,還有spring-mvc的配置文件的詳細(xì)介紹,通過(guò)項(xiàng)目實(shí)踐步驟給大家詳細(xì)介紹,感興趣的朋友一起看看吧2021-06-06
SpringBoot集成itext實(shí)現(xiàn)html轉(zhuǎn)PDF
iText是著名的開(kāi)放源碼的站點(diǎn)sourceforge一個(gè)項(xiàng)目,是用于生成PDF文檔的一個(gè)java類庫(kù),本文主要介紹了如何利用itext實(shí)現(xiàn)html轉(zhuǎn)PDF,需要的可以參考下2024-03-03
解決后端傳long類型數(shù)據(jù)到前端精度丟失問(wèn)題
這篇文章主要介紹了解決后端傳long類型數(shù)據(jù)到前端精度丟失問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
使用Java的方式模擬Flutter的Widget實(shí)現(xiàn)多層括號(hào)嵌套
這篇文章主要介紹了使用Java的方式模擬Flutter的Widget的實(shí)現(xiàn)多層括號(hào)嵌套問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Java設(shè)計(jì)模式之建造者模式(Builder模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之建造者模式(Builder模式)介紹,本文講解了為何使用建造者模式、如何使用建造者模式、Builder模式的應(yīng)用等內(nèi)容,需要的朋友可以參考下2015-03-03
Springmvc自定義類型轉(zhuǎn)換器實(shí)現(xiàn)步驟
這篇文章主要介紹了Springmvc自定義類型轉(zhuǎn)換器實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Spring實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離詳解
這篇文章主要介紹了Spring?實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離,大多數(shù)系統(tǒng)都是讀多寫(xiě)少,為了降低數(shù)據(jù)庫(kù)的壓力,可以對(duì)主庫(kù)創(chuàng)建多個(gè)從庫(kù),從庫(kù)自動(dòng)從主庫(kù)同步數(shù)據(jù),程序中將寫(xiě)的操作發(fā)送到主庫(kù),將讀的操作發(fā)送到從庫(kù)去執(zhí)行,需要的朋友可以參考下2024-01-01
Java中BufferedReader與BufferedWriter類的使用示例
BufferedReader與BufferedWriter分別繼承于Reader和Writer類,分別為字符的讀取和寫(xiě)入添加緩沖功能,這里我們就來(lái)看一下Java中BufferedReader與BufferedWriter類的使用示例:2016-06-06
Java使用Statement接口執(zhí)行SQL語(yǔ)句操作實(shí)例分析
這篇文章主要介紹了Java使用Statement接口執(zhí)行SQL語(yǔ)句操作,結(jié)合實(shí)例形式詳細(xì)分析了Java使用Statement接口針對(duì)mysql數(shù)據(jù)庫(kù)進(jìn)行連接與執(zhí)行SQL語(yǔ)句增刪改查等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-07-07

