每天学点java_反射作用
生活随笔
收集整理的這篇文章主要介紹了
每天学点java_反射作用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.czj;
import java.util.List;
public class Person {
?? ?String str= "";
?? ?public Person() {
?? ??? ?System.out.println("person 空構造函數");
?? ?}
?? ?public Person(String str ) {
?? ??? ?System.out.println(str);
?? ?}
?? ?
?? ?public Person(String str,int i ) {
?? ??? ?System.out.println(str+":"+i);
?? ?}
?? ?
?? ?private Person(List list){
?? ??? ??? ?System.out.println("list");
?? ?}
?? ?
?? ?
?? ?public void out(){
?? ??? ?System.out.println("調用out()方法,為空");
?? ?}
?? ?
?? ?public Class[] out(String name,int password){
?? ??? ?System.out.println(name+":"+password);
?? ??? ?return new Class[] {};
?? ?}
?? ?
?? ?private void out(String name){
?? ??? ?System.out.println(name);
?? ?}
}
package com.czj;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Demo {
?? ?/*
?? ? * 反射機制, 創建類的對象; 獲取類里面的 屬性;方法;構造函數;
?? ? */
?? ?public void test() throws Exception{
?? ??? ?//1
?? ??? ?Class class1=Class.forName("com.czj.Person");
?? ??? ?//2
?? ??? ?Class class2=Person.class;
?? ??? ?//3
?? ??? ?Class class3=new Person().getClass();
?? ??? ?
?? ?}
?? ?//1;調用無參構造函數
?? ?public void run1() throws Exception{
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?
?? ??? ?Constructor e= clazz.getConstructor(null);//調用為空的夠早函數; 如果有參數的就把null改為類似?? 類.class(String.class);
?? ??? ?Person p=(Person) e.newInstance(null);//返回一個object對象所以要強制轉換,如果有參數的就把null改為屬性值;
?? ??? ?System.out.println(p.str);
?? ??? ?
?? ?}
?? ?//2;構造有一個參數的構造函數; String.class
?? ?public void run2() throws Exception{
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?
?? ??? ?Constructor e= clazz.getConstructor(String.class);//調用為空的夠早函數; 如果有參數的就把null改為類似?? 類.class(String.class);
?? ??? ?Person p=(Person) e.newInstance("參數string");//返回一個object對象所以要強制轉換,如果有參數的就把null改為屬性值;
?? ??? ?System.out.println(p.str);
?? ??? ?
?? ?}
?? ?//調用有多個參數的構造函數
?? ?public void run3() throws Exception{
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?
?? ??? ?Constructor e= clazz.getConstructor(String.class,int.class);//調用為空的夠早函數; 如果有參數的就把null改為類似?? 類.class(String.class);
?? ??? ?Person p=(Person) e.newInstance("參數string",10);//返回一個object對象所以要強制轉換,如果有參數的就把null改為屬性值;
?? ??? ?System.out.println(p.str);
?? ??? ?
?? ?}
?? ?//調用私有的構造函數
?? ?public void run4() throws Exception{
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?
?? ??? ?Constructor e= clazz.getDeclaredConstructor(List.class);//調用為私有的函數; 用到getDeclaredConstructor
?? ??? ?e.setAccessible(true);//暴力破解,如果是private一樣能訪問到里面的東西;
?? ??? ?Person p=(Person) e.newInstance(new ArrayList());//返回一個object對象所以要強制轉換,如果有參數的就把null改為屬性值;
?? ??? ?System.out.println(p.str);
?? ??? ?
?? ?}
?? ?
?? ?public void go() throws Exception{
?? ??? ?Person p=new Person();
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?Method method=clazz.getMethod("out", String.class,int.class);//第一個參數值為方法名, 第二個為參數類型;
?? ??? ?method.invoke(p, "調用帶2個參數的方法",10);
?? ??? ?
?? ?}
?? ?public void go1() throws Exception{
?? ??? ?Person p=new Person();
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?Method method=clazz.getDeclaredMethod("out",String.class);//第一個參數值為方法名, 第二個為參數類型,可以有多個參數類型;
?? ??? ?method.setAccessible(true);//暴力獲取私有權限;? 私有方法獲取用declaredmethod.
?? ??? ?method.invoke(p, "調用帶2個參數的方法");
?? ??? ?
?? ?}
?? ?
?? ?
?? ?
?? ?
?? ?public static void main(String []args) throws Exception{
?? ??? ?Demo demo=new Demo();
/*?? ??? ??? ?demo.run1();
?? ??? ??? ?demo.run2();
?? ??? ??? ?demo.run3();
?? ??? ??? ?demo.run4();*/
?? ??? ?
?? ??? ?demo.go1();
?? ?}
?? ?
}
import java.util.List;
public class Person {
?? ?String str= "";
?? ?public Person() {
?? ??? ?System.out.println("person 空構造函數");
?? ?}
?? ?public Person(String str ) {
?? ??? ?System.out.println(str);
?? ?}
?? ?
?? ?public Person(String str,int i ) {
?? ??? ?System.out.println(str+":"+i);
?? ?}
?? ?
?? ?private Person(List list){
?? ??? ??? ?System.out.println("list");
?? ?}
?? ?
?? ?
?? ?public void out(){
?? ??? ?System.out.println("調用out()方法,為空");
?? ?}
?? ?
?? ?public Class[] out(String name,int password){
?? ??? ?System.out.println(name+":"+password);
?? ??? ?return new Class[] {};
?? ?}
?? ?
?? ?private void out(String name){
?? ??? ?System.out.println(name);
?? ?}
}
package com.czj;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Demo {
?? ?/*
?? ? * 反射機制, 創建類的對象; 獲取類里面的 屬性;方法;構造函數;
?? ? */
?? ?public void test() throws Exception{
?? ??? ?//1
?? ??? ?Class class1=Class.forName("com.czj.Person");
?? ??? ?//2
?? ??? ?Class class2=Person.class;
?? ??? ?//3
?? ??? ?Class class3=new Person().getClass();
?? ??? ?
?? ?}
?? ?//1;調用無參構造函數
?? ?public void run1() throws Exception{
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?
?? ??? ?Constructor e= clazz.getConstructor(null);//調用為空的夠早函數; 如果有參數的就把null改為類似?? 類.class(String.class);
?? ??? ?Person p=(Person) e.newInstance(null);//返回一個object對象所以要強制轉換,如果有參數的就把null改為屬性值;
?? ??? ?System.out.println(p.str);
?? ??? ?
?? ?}
?? ?//2;構造有一個參數的構造函數; String.class
?? ?public void run2() throws Exception{
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?
?? ??? ?Constructor e= clazz.getConstructor(String.class);//調用為空的夠早函數; 如果有參數的就把null改為類似?? 類.class(String.class);
?? ??? ?Person p=(Person) e.newInstance("參數string");//返回一個object對象所以要強制轉換,如果有參數的就把null改為屬性值;
?? ??? ?System.out.println(p.str);
?? ??? ?
?? ?}
?? ?//調用有多個參數的構造函數
?? ?public void run3() throws Exception{
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?
?? ??? ?Constructor e= clazz.getConstructor(String.class,int.class);//調用為空的夠早函數; 如果有參數的就把null改為類似?? 類.class(String.class);
?? ??? ?Person p=(Person) e.newInstance("參數string",10);//返回一個object對象所以要強制轉換,如果有參數的就把null改為屬性值;
?? ??? ?System.out.println(p.str);
?? ??? ?
?? ?}
?? ?//調用私有的構造函數
?? ?public void run4() throws Exception{
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?
?? ??? ?Constructor e= clazz.getDeclaredConstructor(List.class);//調用為私有的函數; 用到getDeclaredConstructor
?? ??? ?e.setAccessible(true);//暴力破解,如果是private一樣能訪問到里面的東西;
?? ??? ?Person p=(Person) e.newInstance(new ArrayList());//返回一個object對象所以要強制轉換,如果有參數的就把null改為屬性值;
?? ??? ?System.out.println(p.str);
?? ??? ?
?? ?}
?? ?
?? ?public void go() throws Exception{
?? ??? ?Person p=new Person();
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?Method method=clazz.getMethod("out", String.class,int.class);//第一個參數值為方法名, 第二個為參數類型;
?? ??? ?method.invoke(p, "調用帶2個參數的方法",10);
?? ??? ?
?? ?}
?? ?public void go1() throws Exception{
?? ??? ?Person p=new Person();
?? ??? ?Class clazz=Class.forName("com.czj.Person");
?? ??? ?Method method=clazz.getDeclaredMethod("out",String.class);//第一個參數值為方法名, 第二個為參數類型,可以有多個參數類型;
?? ??? ?method.setAccessible(true);//暴力獲取私有權限;? 私有方法獲取用declaredmethod.
?? ??? ?method.invoke(p, "調用帶2個參數的方法");
?? ??? ?
?? ?}
?? ?
?? ?
?? ?
?? ?
?? ?public static void main(String []args) throws Exception{
?? ??? ?Demo demo=new Demo();
/*?? ??? ??? ?demo.run1();
?? ??? ??? ?demo.run2();
?? ??? ??? ?demo.run3();
?? ??? ??? ?demo.run4();*/
?? ??? ?
?? ??? ?demo.go1();
?? ?}
?? ?
}
?
調用私有的反射時, 第一次忘記是getDeclaredConstructor()方法; 還有java報運行錯誤; 因為List.class我使用的java.awt.list包.有時候可以檢查包是否導入正確來排除一些問題
轉載于:https://www.cnblogs.com/JohnChen-happy/p/4337086.html
總結
以上是生活随笔為你收集整理的每天学点java_反射作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都发放1亿元新能源汽车消费奖励金:不限
- 下一篇: 【MariaDB】MariaDB编译参数