찾다
Javajava지도 시간Java 튜토리얼--기본 강화_반사

Java 튜토리얼--기본 강화_반사

Jun 27, 2017 am 09:19 AM
강하게 하다반사베이스

JavaBean: 데이터베이스 테이블과 엔터티 클래스의 대응
1. 데이터베이스에 테이블이 있으면 그 테이블에 해당하는 클래스가 있을 것입니다
데이터베이스: Person 테이블 Java: Preson 클래스
2. 테이블의 각 열은 다음에 해당합니다. Java A 필드(멤버 변수)
3. 테이블의 각 행은 Java의 객체에 해당합니다.
Zhang San 18 men new Person(Zhang San 18 man);
Xiaohua 18 female new Person(Xiaohua 18 female);
더 많은 객체 컬렉션 ArrayList에 배치될 수 있습니다.

JavaBean에는 다음이 포함됩니다.
1. 전용 멤버 변수
2. 공용 getter/setter 메소드
3. 빈 매개변수 구성 메소드
4. toString 메소드
5. 직렬화 인터페이스 구현

클래스 파일 객체를 얻는 세 가지 방법:
1. 객체 클래스
Class> getClass()의 getClass() 메서드를 사용하여 이 객체의 런타임 클래스를 반환합니다.
2. 클래스 이름.class 속성을 사용하세요
각 데이터 유형, 기본 데이터 유형 및 참조 데이터 유형에 대해 Java는 이에 대한 클래스 속성을 설정합니다.
클래스 clazz = int.class
클래스 clazz = String.class
클래스 clazz = Person .class
3. Class 클래스에서 정적 메소드 forName
을 사용합니다. static Class> forName(String className)
주어진 문자열 이름을 가진 클래스 또는 인터페이스와 연관된 Class 객체를 반환합니다.

참고: 각 클래스의 클래스 파일 개체는 한 번만 생성되며 고유합니다.

리플렉션 기술을 사용하여 클래스의 생성자를 가져와 인스턴스화합니다.
* public Person() {}
* public Person(문자열 이름, int age, String sex) {}
* private Person(String name, int age) {}
*
* 구현 단계:
* 1. Person 클래스의 클래스 파일 객체를 가져옵니다.
* 2. getConstructor 메소드를 사용합니다. 클래스 파일 객체 생성자 메서드 가져오기
* 3. 생성자의 newInstrance 메서드를 사용하여 생성자를 인스턴스화합니다.


리플렉션을 사용하여 빈 매개변수 객체를 생성하는 빠른 방법
* 사용을 위한 전제 조건:
* 1. 다음이 있어야 합니다. 클래스에 빈 매개변수가 있는 생성자 메서드
* 2. 빈 매개변수가 있는 생성자 메서드의 수정자는 비공개일 수 없습니다. public
*
* 클래스 클래스에 메서드가 있습니다
* T newInstance() 이 Class 객체가 나타내는 클래스의 새 인스턴스를 만듭니다.
*

리플렉션 기술을 사용하여 클래스의 멤버 변수(필드)를 얻고, 멤버 변수에 값을 할당하고, 값을 얻습니다.
* private String name;
* private int age
* public String;
*
* 구현 단계:
* 1. Person 클래스의 클래스 파일 개체를 가져옵니다.
* 2. 클래스 파일 개체의 getField 메서드를 사용하여 멤버 변수를 가져옵니다.
* 3. get/set 메서드를 사용합니다. 필드에서 멤버 변수 값을 가져오고 멤버 변수에 값을 할당합니다.

 1  public static void main(String[] args) throws Exception { 2         //1.获取Person类的class文件对象 3         Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4         //2.使用class文件对象中的方法getField获取成员变量 5         /* 6          *  Field[] getFields()  获取类中所有可访问公共字段。 7          *  Field[] getDeclaredFields()  获取类中所有的声明字段,包含私有的。 8          */ 9         Field[] fields1 = clazz.getFields();10         for (Field field : fields1) {11             System.out.println(field);12         }13         System.out.println("------------------");14         Field[] fields2 = clazz.getDeclaredFields();15         for (Field field : fields2) {16             System.out.println(field);17         }18         System.out.println("------------------");19         20         /*21          * Field getField(String name)  获取类中指定公共成员字段。22          * Field getDeclaredField(String name)  获取类中指定的声明字段,包含私有的。23          * 参数:24          *     String name:字段的名字25          */26         //public String sex;27         Field sexField = clazz.getField("sex");28         System.out.println(sexField);29         //private String name;30         Field nameField = clazz.getDeclaredField("name");31         System.out.println(nameField);32         //private int age;33         Field ageField = clazz.getDeclaredField("age");34         System.out.println(ageField);35         36         /*37          * 3.使用Field中的方法get/set获取成员变量值,给成员变量赋值38          * Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。 
39          * void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。40          * 参数:41          *     Object obj:要设置值/获取的值的对象,可以使用反射快速创建42          *     Object value:给成员变量设置的实际值43          * 返回值:44          *     Object:获取成员变量的返回值    
45          */46         //使用反射创建对象47         Object obj = clazz.newInstance();48         49         //public String sex;50         //get(obj);-->getSex();51         Object sexValue = sexField.get(obj);52         System.out.println(sexValue);//默认值 null53         54         /*55          * private String name;56          * 私有的属性无法直接使用,必须先取消Java的权限检查(暴力反射)57          */58         nameField.setAccessible(true);59         Object nameValue = nameField.get(obj);60         System.out.println(nameValue);//默认值 null61         62         //private int age;63         ageField.setAccessible(true);64         Object ageValue = ageField.get(obj);65         System.out.println(ageValue);//默认值 066         System.out.println("------------------");67         /*68          * 设置成员变量的值69          */70         //public String sex;71         sexField.set(obj, "妖");72         //获取值73         sexValue = sexField.get(obj);74         System.out.println(sexValue);//妖75         76         //private String name;77         nameField.set(obj, "泰国美女");78         //获取值79         nameValue = nameField.get(obj);80         System.out.println(nameValue);//泰国美女81         82         //private int age;83         ageField.set(obj, 18);84         //获取值85         ageValue = ageField.get(obj);86         System.out.println(ageValue);//1887         System.out.println(obj);//Person [name=泰国美女, age=18, sex=妖]88     }

리플렉션 기술을 사용하여 클래스의 멤버 메서드를 가져와 실행합니다.
* public String getName()
* public void setName(String name)
* private void method()
*
* 구현 단계:
* 1. Person 클래스 가져오기 클래스 파일 객체
* 2. 클래스 파일 객체의 getMethod 메소드를 사용하여 멤버 메소드 가져오기
* 3. 획득한 메소드를 실행하기 위해 Method 내 메소드 호출
*
* Method 클래스의 메소드: getName, 메소드 이름 가져오기
* String getName()은 이 Method 객체가 나타내는 메소드 이름을 String 형식으로 반환합니다.

 1 public static void main(String[] args) throws Exception { 2         //1.获取Person类的class文件对象 3         Class clazz = Class.forName("cn.itcast.demo02.javabean.Person"); 4         //2.使用class文件对象中的方法getMethod获取成员方法 5         /* 6          * Method[] getMethods() 获取类中所有的公共方法,包含继承父类的 7          * Method[] getDeclaredMethods() 包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 
 8          */ 9         Method[] methods1 = clazz.getMethods();10         for (Method method : methods1) {11             System.out.println(method);12         }13         System.out.println("----------------------");14         Method[] methods2 = clazz.getDeclaredMethods();15         for (Method method : methods2) {16             System.out.println(method.getName());17         }18         System.out.println("----------------------");19         /*20          *  Method getMethod(String name, Class>... parameterTypes) 获取类中指定公共成员方法。21          *  Method getDeclaredMethod(String name, Class>... parameterTypes) 获取类中指定的成员方法,包含私有的.22          *  参数:23          *      String name:方法的字符串名称24          *      Class>... parameterTypes:方法参数列表的class对象    
25          */26         //public String getName()27         Method getNameMethod = clazz.getMethod("getName");28         System.out.println(getNameMethod);29         30         //public void setName(String name)31         Method setNameMethod = clazz.getMethod("setName", String.class);32         System.out.println(setNameMethod);33         34         //private void method()35         Method privateMethod = clazz.getDeclaredMethod("method");36         System.out.println(privateMethod);37         38         /*39          * 3.使用Method中的方法invoke执行获取到的方法40          * Object invoke(Object obj, Object... args) 
41          * 参数:42          *     Object obj:要执行的方法的所属对象43          *     Object... args:执行方法,传递的实际参数44          * 返回值:45          *     Object:方法的返回值46          *     如果方法没有返回值,Object的值为null47          */48         Object obj = clazz.newInstance();49         50         //public String getName()51         Object v1 = getNameMethod.invoke(obj);52         System.out.println(v1);//成员变量 name的默认值:null53         54         //public void setName(String name)55         Object v2 = setNameMethod.invoke(obj, "楼上老宋");56         System.out.println(v2);57         58         v1 = getNameMethod.invoke(obj);59         System.out.println(v1);//成员变量 name的值:楼上老宋60         61         /*62          * private void method()63          * 使用暴力反射,取消Java的权限检查64          */65         privateMethod.setAccessible(true);66         privateMethod.invoke(obj);//私有方法67         68         System.out.println("-------------");69         //获取返回值为数组的方法70         Method arrMethod = clazz.getMethod("methodArr");71         Object v3 = arrMethod.invoke(obj);72         int[] arr = (int[]) v3;73         System.out.println(v3);74         System.out.println(arr);75         for (int i : arr) {76             System.out.println(i);77         }78     }

Reflection의 종합 사례:
* Reflection 기술을 통해 JavaBean 객체를 얻고, JavaBean 멤버 변수에 값을 주입(할당)합니다
*
* 구현 단계:
* 1. JavaBean(사용자 클래스) 생성
* 2. data.properties 구성 파일을 생성하고 멤버 변수의 실제 값을 구성합니다
* 3. IO+Properties 컬렉션을 사용하여 구성 파일을 읽고 파일의 데이터를 컬렉션에 저장합니다
* 4. 사용 JavaBean 객체 생성을 위한 리플렉션 기술
* 5. Properties 컬렉션 탐색
* 6. Properties 컬렉션 키를 사용하여 setXXX 메서드 연결
* 7. 리플렉션 기술을 사용하여 setXXX 메서드 획득
* 8. 리플렉션 기술을 사용하여 실행 setXXX 메서드를 사용하여 멤버 변수에 값을 삽입합니다

 1 public static void main(String[] args) throws Exception { 2         //3.使用IO+Properties集合,读取配置文件,把文件中的数据保存到集合中 3         Properties prop = new Properties(); 4         prop.load(new FileReader("data.properties")); 5         //4.使用反射技术创建JavaBean对象 6         Class clazz = Class.forName("cn.itcast.demo02.javabean.User"); 7         Object obj = clazz.newInstance(); 8         //5.遍历Properties集合 9         Set<string> set = prop.stringPropertyNames();10         for (String key : set) {11             /*12              * 6.使用Properties集合key拼接setXXX方法13              * 类中的set方法:14              *     setId,setUsername,setPassword15              * 集合的key:16              *     id,username,password17              * 拼接的过程:18              *     1.固定的字符串:"set"19              *     2.获取key的首字母,变成大写20              *     3.获取key的其它字母21              */22             String methodName = "set"+key.substring(0, 1).toUpperCase()+key.substring(1);23             //System.out.println(methodName);24             25             //7.使用反射技术获取setXXX方法26             Method setMethod = clazz.getMethod(methodName, String.class);27             //8.使用反射技术执行setXXX方法,给成员变量注入值(集合的value值)28             setMethod.invoke(obj, prop.get(key));29             30             /*31              * 扩展:拼接getXXX方法32              */33             String getMethodName = "get"+key.substring(0, 1).toUpperCase()+key.substring(1);34             Method getMethod = clazz.getMethod(getMethodName);35             Object value = getMethod.invoke(obj);36             System.out.println(value);37         }38         System.out.println(obj);39     }</string>

리플렉션 기술을 사용하여 인터페이스를 가져옵니다
* Class>[] getInterfaces()는 클래스가 구현하는 인터페이스 또는 이 객체가 나타내는 인터페이스를 결정합니다

으르르르르

위 내용은 Java 튜토리얼--기본 강화_반사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구