溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中反射機(jī)制怎么用

發(fā)布時(shí)間:2021-08-04 09:46:37 來(lái)源:億速云 閱讀:158 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了Java中反射機(jī)制怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

反射機(jī)制是什么

反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制。

反射機(jī)制能做什么

反射機(jī)制主要提供了以下功能:

① 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi);
② 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象;
③ 在運(yùn)行時(shí)判斷任意一個(gè)類(lèi)所具有的成員變量和方法;
④ 在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法;
⑤ 生成動(dòng)態(tài)代理。

反射機(jī)制的相關(guān)API

InterFace 接口

package com.app;
public interface InterFace {
  void read() ;
}

Person 類(lèi)

package com.app;
public class Person implements InterFace {
  private String id ;
  private String name ;
  public String age ;
  //構(gòu)造函數(shù)1
  public Person( ){
  }
  //構(gòu)造函數(shù)2
  public Person( String id ){
    this.id = id ;
  }
  //構(gòu)造函數(shù)3
  public Person( String id , String name ){
    this.id = id ;
    this.name = name ;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getAge() {
    return age;
  }
  public void setAge(String age) {
    this.age = age;
  }
  /**
   * 靜態(tài)方法
   */
  public static void update(){
  }
  @Override
  public void read() {
  }
}

獲取類(lèi):3種方法

package com.app;
public class T1 {
  public static void main(String[] args) {
    //第一種方法:forName
    try {
      Class<?> class1 = Class.forName("com.app.Person");
      System.out.println( class1 );
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
    //第二張方法:class
    Class<?> class2 = Person.class; 
    //第三種方法:getClass
    Person person = new Person(); 
    Class<?> class3 = person.getClass();
    System.out.println( class2 );
    System.out.println( class3 );
  }
}

運(yùn)行結(jié)果:

class com.app.Person
class com.app.Person
class com.app.Person

獲取所有的方法:getMethods( )

package com.app;
import java.lang.reflect.Method;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");
      //獲取所有的公共的方法
      Method[] methods = class1.getMethods() ;
      for (Method method : methods) {
        System.out.println( method );
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

//自定義方法
public static void com.app.Person.update()
public java.lang.String com.app.Person.getName()
public void com.app.Person.read()
public java.lang.String com.app.Person.getId()
public void com.app.Person.setName(java.lang.String)
public void com.app.Person.setId(java.lang.String)
//父類(lèi)Object類(lèi)方法
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

獲取所有實(shí)現(xiàn)的接口:getInterfaces()

package com.app;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");
      //獲取所有的接口
      Class<?>[] interS = class1.getInterfaces() ;
      for (Class<?> class2 : interS ) {
        System.out.println( class2 );
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

interface com.app.InterFace

獲取父類(lèi):getSuperclass()

package com.app;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");
      //獲取父類(lèi)
      Class<?> superclass = class1.getSuperclass() ;
      System.out.println( superclass );
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

//父類(lèi)是Object類(lèi)
class java.lang.Object

獲取所有的構(gòu)造函數(shù):getConstructors()

package com.app;
import java.lang.reflect.Constructor;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");
      //獲取所有的構(gòu)造函數(shù)
      Constructor<?>[] constructors = class1.getConstructors() ;
      for (Constructor<?> constructor : constructors) {
        System.out.println( constructor );
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

public com.app.Person(java.lang.String,java.lang.String)
public com.app.Person(java.lang.String)
public com.app.Person()

獲取所有的屬性:getDeclaredFields();

package com.app;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");
      //取得本類(lèi)的全部屬性
      Field[] field = class1.getDeclaredFields();
      for (Field field2 : field) {
        System.out.println( field2 );
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

private java.lang.String com.app.Person.id
private java.lang.String com.app.Person.name

可以看出屬性的修飾符是: private , 數(shù)據(jù)類(lèi)型:String ,名字:id/name

創(chuàng)建實(shí)例:newInstance()

package com.app;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");;
      //創(chuàng)建實(shí)例化:相當(dāng)于 new 了一個(gè)對(duì)象
      Object object = class1.newInstance() ;
      //向下轉(zhuǎn)型
      Person person = (Person) object ;
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
  }
}

getDeclaredFields 和 getFields 的區(qū)別

getDeclaredFields()獲得某個(gè)類(lèi)的所有申明的字段,即包括public、private和proteced,但是不包括父類(lèi)的申明字段。
getFields()獲得某個(gè)類(lèi)的所有的公共(public)的字段,包括父類(lèi)。

小例子

package com.app;
import java.lang.reflect.Field;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");;
      //獲得所有的字段屬性:包括 
      Field[] declaredFields = class1.getDeclaredFields() ;
      Field[] fields = class1.getFields() ;
      for( Field field : declaredFields ){
        System.out.println( "de-- " + field );
      }
      for( Field field : fields ){
        System.out.println( "fields-- " + field );
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

de-- private java.lang.String com.app.Person.id
de-- private java.lang.String com.app.Person.name
de-- public java.lang.String com.app.Person.age
fields-- public java.lang.String com.app.Person.age

實(shí)戰(zhàn)1:通過(guò)反射,獲取對(duì)象實(shí)例,并且操作對(duì)象的方法

package com.app;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");;
      //創(chuàng)建實(shí)例化:相當(dāng)于 new 了一個(gè)對(duì)象
      Object object = class1.newInstance() ;
      //向下轉(zhuǎn)型       
      Person person = (Person) object ;
      person.setId( "100");
      person.setName( "jack") ; 
      System.out.println( "id: " + person.getId() + " name: " + person.getName() );
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

id: 100 name: jack

實(shí)戰(zhàn)2:通過(guò)反射獲取對(duì)象字段屬性,并且賦值

package com.app;
import java.lang.reflect.Field;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");
      //創(chuàng)建實(shí)例
      Object person = class1.newInstance();
      //獲得id 屬性
      Field idField = class1.getDeclaredField( "id" ) ;
      //給id 屬性賦值
      idField.set( person , "100") ;
      //打印 person 的屬性值
      System.out.println( idField.get( person ));
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace() ;
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

java.lang.IllegalAccessException: Class com.app.T1 can not access a member of class com.app.Person with modifiers "private"
  at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
  at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source)
  at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source)
  at java.lang.reflect.Field.set(Unknown Source)
  at com.app.T1.main(T1.java:20)

程序崩潰,原因是:id 這個(gè)屬性的是 private 私有的,不能修改它的值。

改進(jìn):

添加 idField.setAccessible( true );

完整的代碼為:

package com.app;
import java.lang.reflect.Field;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");
      //創(chuàng)建實(shí)例
      Object person = class1.newInstance();
      //獲得id 屬性
      Field idField = class1.getDeclaredField( "id" ) ;
      //打破封裝 實(shí)際上setAccessible是啟用和禁用訪問(wèn)安全檢查的開(kāi)關(guān),并不是為true就能訪問(wèn)為false就不能訪問(wèn) 
      //由于JDK的安全檢查耗時(shí)較多.所以通過(guò)setAccessible(true)的方式關(guān)閉安全檢查就可以達(dá)到提升反射速度的目的 
      idField.setAccessible( true );
      //給id 屬性賦值
      idField.set( person , "100") ;
      //打印 person 的屬性值
      System.out.println( idField.get( person ));
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace() ;
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

100

實(shí)戰(zhàn)3:綜合訓(xùn)練,反射操作屬性和方法

package com.app;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");
      //創(chuàng)建實(shí)例
      Object person = class1.newInstance();
      //獲得id 屬性
      Field idField = class1.getDeclaredField( "id" ) ;
      //打破封裝 實(shí)際上setAccessible是啟用和禁用訪問(wèn)安全檢查的開(kāi)關(guān),并不是為true就能訪問(wèn)為false就不能訪問(wèn) 
      //由于JDK的安全檢查耗時(shí)較多.所以通過(guò)setAccessible(true)的方式關(guān)閉安全檢查就可以達(dá)到提升反射速度的目的 
      idField.setAccessible( true );
      //給id 屬性賦值
      idField.set( person , "100") ;
      //獲取 setName() 方法
      Method setName = class1.getDeclaredMethod( "setName", String.class ) ;
      //打破封裝 
      setName.setAccessible( true );
      //調(diào)用setName 方法。
      setName.invoke( person , "jack" ) ;
      //獲取name 字段
      Field nameField = class1.getDeclaredField( "name" ) ;
      //打破封裝 
      nameField.setAccessible( true );
      //打印 person 的 id 屬性值
      String id_ = (String) idField.get( person ) ;
      System.out.println( "id: " + id_ );
      //打印 person 的 name 屬性值
      String name_ = ( String)nameField.get( person ) ;
      System.out.println( "name: " + name_ );
      //獲取 getName 方法
      Method getName = class1.getDeclaredMethod( "getName" ) ;
      //打破封裝 
      getName.setAccessible( true );
      //執(zhí)行g(shù)etName方法,并且接收返回值
      String name_2 = (String) getName.invoke( person ) ;
      System.out.println( "name2: " + name_2 );
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace() ;
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

id: 100
name: jack
name2: jack

實(shí)戰(zhàn)4:靜態(tài)屬性、靜態(tài)方法調(diào)用

定義 Util 類(lèi)

package com.app;
public class Util {
  public static String name = "json" ;
  /**
   * 沒(méi)有返回值,沒(méi)有參數(shù)
   */
  public static void getTips(){
    System.out.println( "執(zhí)行了---------1111");
  }
  /**
   * 有返回值,沒(méi)有參數(shù)
   */
  public static String getTip(){
    System.out.println( "執(zhí)行了---------2222");
    return "tip2" ;
  }
  /**
   * 沒(méi)有返回值,有參數(shù)
   * @param name
   */
  public static void getTip( String name ){
    System.out.println( "執(zhí)行了---------3333 參數(shù): " + name );
  }
  /**
   * 有返回值,有參數(shù)
   * @param id
   * @return
   */
  public static String getTip( int id ){
    System.out.println( "執(zhí)行了---------4444 參數(shù): " + id );
    if ( id == 0 ){
      return "tip1 444 --1 " ;
    }else{
      return "tip1 444 --2" ;
    }
  }
}

完整小例子:

package com.app;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Util");
      //獲取 nameField 屬性
      Field nameField = class1.getDeclaredField( "name" ) ;
      //獲取 nameField 的值
      String name_ = (String) nameField.get( nameField ) ;
      //輸出值
      System.out.println( name_ );
      //沒(méi)有返回值,沒(méi)有參數(shù)
      Method getTipMethod1 = class1.getDeclaredMethod( "getTips" ) ; 
      getTipMethod1.invoke( null ) ;
      //有返回值,沒(méi)有參數(shù)
      Method getTipMethod2 = class1.getDeclaredMethod( "getTip" ) ; 
      String result_2 = (String) getTipMethod2.invoke( null ) ;
      System.out.println( "返回值: "+ result_2 );
      //沒(méi)有返回值,有參數(shù)
      Method getTipMethod3 = class1.getDeclaredMethod( "getTip" , String.class ) ; 
      String result_3 = (String) getTipMethod3.invoke( null , "第三個(gè)方法" ) ;
      System.out.println( "返回值: "+ result_3 );
      //有返回值,有參數(shù)
      Method getTipMethod4 = class1.getDeclaredMethod( "getTip" , int.class ) ; 
      String result_4 = (String) getTipMethod4.invoke( null , 1 ) ;
      System.out.println( "返回值: "+ result_4 );
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace() ;
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果:

json
執(zhí)行了---------1111
執(zhí)行了---------2222
返回值: tip2
執(zhí)行了---------3333 參數(shù): 第三個(gè)方法
返回值: null
執(zhí)行了---------4444 參數(shù): 1
返回值: tip1 444 --2

當(dāng)參數(shù)是 int 類(lèi)型 和 Integer 類(lèi)型,反射獲取方法不一樣

① 當(dāng)參數(shù)是 int 類(lèi)型時(shí)

/**
* 沒(méi)有返回值,有參數(shù)
* @param id
*/
public static void getTip( int id ){
}

獲取方法的時(shí)候需要用:int.class。不能使用 Integer.class. 會(huì)報(bào)錯(cuò)。

Method getTipMethod4 = class.getDeclaredMethod( "getTip" , int.class ) ; 
String result_4 = (String) getTipMethod4.invoke( null , 1 ) ;
System.out.println( "返回值: "+ result_4 );

② 當(dāng)參數(shù)是 Integer類(lèi)型時(shí)

/**
* 沒(méi)有返回值,有參數(shù)
* @param id
*/
public static void getTip( Integer id ){
}

獲取方法的時(shí)候需要用:Integer .class。不能使用 int.class. 會(huì)報(bào)錯(cuò)。

Method getTipMethod4 = class.getDeclaredMethod( "getTip" , Integer .class ) ; 
String result_4 = (String) getTipMethod4.invoke( null , 1 ) ;
System.out.println( "返回值: "+ result_4 );

創(chuàng)建對(duì)象實(shí)例

Person 類(lèi)

package com.app;
public class Person{
  private String id ;
  private String name ;
  //構(gòu)造函數(shù)1
  public Person( ){
    System.out.println( "構(gòu)造函數(shù) 無(wú)參" );
  }
  //構(gòu)造函數(shù)2
  public Person( String id ){
    this.id = id ;
    System.out.println( "構(gòu)造函數(shù) id : " + id );
  }
  //構(gòu)造函數(shù)3
  public Person( String id , String name ){
    this.id = id ;
    this.name = name ;
    System.out.println( "構(gòu)造函數(shù) id : " + id + " name: " + name );
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

創(chuàng)建實(shí)例實(shí)戰(zhàn)

package com.app;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class T1 {
  public static void main(String[] args) {
    try {
      //創(chuàng)建類(lèi)
      Class<?> class1 = Class.forName("com.app.Person");
      //無(wú)參構(gòu)造函數(shù)
      Object object = class1.newInstance() ;
      //有參構(gòu)造函數(shù):一個(gè)參數(shù)
      Constructor<?> constructor = class1.getDeclaredConstructor( String.class ) ;
      constructor.newInstance( "1000" ) ;
      //有參構(gòu)造函數(shù):二個(gè)參數(shù)
      Constructor<?> constructor2 = class1.getDeclaredConstructor( String.class , String.class ) ;
      constructor2.newInstance( "1001" , "jack" ) ;
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace() ;
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

運(yùn)行結(jié)果

構(gòu)造函數(shù) 無(wú)參
構(gòu)造函數(shù) id : 1000
構(gòu)造函數(shù) id : 1001 name: jack

總結(jié)

Class類(lèi)提供了四個(gè)public方法,用于獲取某個(gè)類(lèi)的構(gòu)造方法。

Constructor getConstructor(Class[] params)     根據(jù)構(gòu)造函數(shù)的參數(shù),返回一個(gè)具體的具有public屬性的構(gòu)造函數(shù)
Constructor getConstructors()     返回所有具有public屬性的構(gòu)造函數(shù)數(shù)組
Constructor getDeclaredConstructor(Class[] params)     根據(jù)構(gòu)造函數(shù)的參數(shù),返回一個(gè)具體的構(gòu)造函數(shù)(不分public和非public屬性)
Constructor getDeclaredConstructors()    返回該類(lèi)中所有的構(gòu)造函數(shù)數(shù)組(不分public和非public屬性)

四種獲取成員方法的方法

Method getMethod(String name, Class[] params)    根據(jù)方法名和參數(shù),返回一個(gè)具體的具有public屬性的方法
Method[] getMethods()    返回所有具有public屬性的方法數(shù)組
Method getDeclaredMethod(String name, Class[] params)    根據(jù)方法名和參數(shù),返回一個(gè)具體的方法(不分public和非public屬性)
Method[] getDeclaredMethods()    返回該類(lèi)中的所有的方法數(shù)組(不分public和非public屬性)

四種獲取成員屬性的方法

Field getField(String name)    根據(jù)變量名,返回一個(gè)具體的具有public屬性的成員變量
Field[] getFields()    返回具有public屬性的成員變量的數(shù)組
Field getDeclaredField(String name)    根據(jù)變量名,返回一個(gè)成員變量(不分public和非public屬性)
Field[] getDelcaredField()    返回所有成員變量組成的數(shù)組(不分public和非public屬性)

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Java中反射機(jī)制怎么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI