反射机制是在运行状态中,对任意的一个类,都可以知道这个类的所有方法和属性; 对于任何一个对象,都可以调用他的任意方法和属性,这种<动态获取/font>的信息以及动态调用对象的方法称为java的反射机制。
1、反编译: .class–>java
2、通过反射机制访问对象的属性,方法,构造方法等
java.lang.Class;
java.lang.reflect.Constructor;
立即学习“Java免费学习笔记(深入)”;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
由于任何类都是Object的子类而Object中有getClass可以获取Class对象
- public final native Class<?> getClass();
-
package com.chb.reflectTest;public class Test {
public static void main(String[] args) throws Exception { //第一种方式:
Class<?> c1 = Class.forName("com.chb.reflectTest.Test"); //第二种方式:java中每个类都有class属性
Class<?> c2 = Test.class; //第三种方式:每个对象都与getClass()方法
Class<?> c3 = new Test().getClass();
}
}获取Class对象以后,使用它创建对象,通过newInstance()调用无参构造函数进行创建对象,newInstance()返回一个Object对象:
Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();分为所有属性和制定的属性
获取修饰
首先通过属性的getModifiers()获取修饰对象,
再通过java.long.reflect.Modifier的toString()打印类,属性的修饰(public , static ,final等)。
获取属性
获取所有属性:通过Class对象的getDeclaedFields(),返回一个Filed的数组**。
获取属性的类型:
通过属性对象(Field对象)的getType()
Class<?> cString = Class.forName("java.lang.String");
//获取累的修饰和名称
System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n");
//获取所有属性
Field[] fields = cString.getDeclaredFields();
for (Field field : fields) {
System.out.print("\t");
System.out.print(
Modifier.toString(field.getModifiers())+" "//属性的修饰
+ field.getType().getSimpleName()+" "
+ field.getName()+"\n");
}
System.out.println("}");创建测试对象:
注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性
package com.chb.reflectTest;public class User {
private String name;
public String nickName;
public User() {}
public User(String name, String nickName) {
this.name = name;
this.nickName = nickName;
}
setter getter...
}package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 {
public static void main(String[] args) throws Exception {
//传统获取属性的值
//1、通过getter,setter
User user1 = new User();
user1.setName("lisi");
System.out.println(user1.getName());
//2、直接调用属性
User user2 = new User();
user2.nickName = "癞皮狗";
System.out.println(user2.nickName);
//=========================================
//通过反射来设置,获取属性。
Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User");
User user = c1.newInstance();
Field nickField = c1.getDeclaredField("nickName");
nickField.set(user, "123");
System.out.println(nickField.get(user));
Field nameFiled = c1.getDeclaredField("name");
//Exception in thread "main" java.lang.IllegalAccessException:
Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"
nameFiled.setAccessible(true);
nameFiled.set(user, "oup");
System.out.println(nameFiled.get(user));
}
}通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
会出现访问错误, 也就是java的安全访问机制,报错:
Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest. User with modifiers "private"
我们通过一个方法·来打破java的封装性:
nameFiled.setAccessible(true);
反射机制是在运行状态中,对任意的一个类,都可以知道这个类的所有方法和属性; 对于任何一个对象,都可以调用他的任意方法和属性,这种<动态获取/font>的信息以及动态调用对象的方法称为java的反射机制。
1、反编译: .class–>java
2、通过反射机制访问对象的属性,方法,构造方法等
java.lang.Class;
java.lang.reflect.Constructor;
立即学习“Java免费学习笔记(深入)”;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
由于任何类都是Object的子类而Object中有getClass可以获取Class对象
- public final native Class<?> getClass();
-
package com.chb.reflectTest;public class Test {
public static void main(String[] args) throws Exception { //第一种方式:
Class<?> c1 = Class.forName("com.chb.reflectTest.Test"); //第二种方式:java中每个类都有class属性
Class<?> c2 = Test.class; //第三种方式:每个对象都与getClass()方法
Class<?> c3 = new Test().getClass();
}
}获取Class对象以后,使用它创建对象,通过newInstance()调用无参构造函数进行创建对象,newInstance()返回一个Object对象:
Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();分为所有属性和制定的属性
获取修饰
首先通过属性的getModifiers()获取修饰对象,
再通过java.long.reflect.Modifier的toString()打印类,属性的修饰(public , static ,final等)。
获取属性
获取所有属性:通过Class对象的getDeclaedFields(),返回一个Filed的数组**。
获取属性的类型:
通过属性对象(Field对象)的getType()
Class<?> cString = Class.forName("java.lang.String");
//获取累的修饰和名称
System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n");
//获取所有属性
Field[] fields = cString.getDeclaredFields();
for (Field field : fields) {
System.out.print("\t");
System.out.print(
Modifier.toString(field.getModifiers())+" "//属性的修饰
+ field.getType().getSimpleName()+" "
+ field.getName()+"\n");
}
System.out.println("}");创建测试对象:
注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性
package com.chb.reflectTest;public class User {
private String name;
public String nickName;
public User() {}
public User(String name, String nickName) {
this.name = name;
this.nickName = nickName;
}
setter getter...
}package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 {
public static void main(String[] args) throws Exception {
//传统获取属性的值
//1、通过getter,setter
User user1 = new User();
user1.setName("lisi");
System.out.println(user1.getName());
//2、直接调用属性
User user2 = new User();
user2.nickName = "癞皮狗";
System.out.println(user2.nickName);
//=========================================
//通过反射来设置,获取属性。
Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User");
User user = c1.newInstance();
Field nickField = c1.getDeclaredField("nickName");
nickField.set(user, "123");
System.out.println(nickField.get(user));
Field nameFiled = c1.getDeclaredField("name");
//Exception in thread "main" java.lang.IllegalAccessException:
Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"
nameFiled.setAccessible(true);
nameFiled.set(user, "oup");
System.out.println(nameFiled.get(user));
}
}通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
会出现访问错误, 也就是java的安全访问机制,报错:
Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest. User with modifiers "private"
我们通过一个方法·来打破java的封装性:
nameFiled.setAccessible(true);
以上就是java之反射基础的内容,更多相关内容请关注PHP中文网(www.php.cn)!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号