如题,JAVA类中属性,方法,构造器,代码块位置有规定吗,还是说可以随意变动呢
如题是给了题目了吗,这边没有显示呢。
如你所说,题主是不明白 Java 类中属性构造器、方法到一些编程规范是吗?
简单说一下:
顺序其实是没有的,不会影响最终类使用的一致性,但从类加载上来说的话,顺序不同会导致谁先执行先后执行。
因为编译器总是从上往下执行的嘛
一个类变量和类方法会先于实例变量和实例方法。
怎么区分?有 static 的就是类变量或者类方法。
从执行次数上来讲代码块,类代码块也就是静态代码块只会执行一次,实例代码块当你每次创建实例都是执行,区分跟上面一样。
类代码块(静态代码块)
static {
System.out.println("静态代码块");
}
实例代码块(代码块)
{
System.out.println("代码块");
}
没有规定顺序,随意
随意变动,但是建议构造器放在方法上面,因为jdk源码就是怎么弄点顺序,至于其他地方顺序你也是可以参考源码中怎么排序的
不知道你这个问题是否已经解决, 如果还没有解决的话:一、前言
在java中,可以通过反射获取类中的所有属性和方法,要判断类中是否包含某个方法或某个属性,使用常见的 getMethod() / getDeclaredMethod() 和 getField() / getDeclaredField() 即可获得对象方法、属性;再判断对象是否为null,即属性是否存在。
这里有一个问题,若当前类的父类的私有属性、私有方法;是获取不到的,这导致判断并不是很准确,有什么更好的办法呢?
二、是否存在某个方法
1、常规判断方法如下 --- 不够完善 :
/**
* @Description: 判断是否包含某个方法
* @param clzz
* @param methodName 方法名称
* @param argsType 参数类型
* @return boolean
* @version v1.0
* @author wu
* @date 2022年5月3日 下午5:50:13
*/
public boolean hasMethod(Class clzz, String methodName, Class[] argsType) {
// 从当前类查找
try {
Method declaredMethod = clzz.getDeclaredMethod(methodName, argsType);
if (declaredMethod != null) {
return true;
}
} catch (NoSuchMethodException e) {
}
// 从父类中查找
try {
Method method = clzz.getMethod(methodName, argsType);
if (null != method) {
return true;
}
} catch (NoSuchMethodException e) {
}
return false;
}
2、新的方法 --- 判断父类的私有方法
/**
* @Description: 判断类中是否包含某个方法
* @param clzz
* @param methodName
* @param argsType
* @return
* @return boolean
* @version v1.0
* @author wu
* @date 2022年5月2日 下午11:03:56
* @see org.springframework.util.ReflectionUtils
*/
public boolean hasMethod2(Class clzz, String methodName, Class[] argsType) {
Method method = ReflectionUtils.findMethod(clzz, methodName, argsType);
if(null != method){
return true;
}
return false;
}
三、是否存在某个字段
1、判断是否存在某个字段 --- 不够完善:
public boolean hasField(Class clzz, String fieldName) {
// 从当前类中查找
Field declaredField = null;
try {
declaredField = clzz.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
}
if (null != declaredField) {
return true;
}
// 从父类中查找 -- 仅限public方法
Field field = null;
try {
field = clzz.getField(fieldName);
} catch (NoSuchFieldException e) {
}
if (null != field) {
return true;
}
return false;
}
2、新的方法 --- 判断父类的私有属性
/**
* @Description: 判断类中是否包含某个字段
* @param clzz
* @param fieldName
* @return boolean
* @version v1.0
* @author wu
* @date 2022年5月2日 下午11:03:34
* @see org.springframework.util.ReflectionUtils
*/
public boolean hasField2(Class clzz, String fieldName) {
Field field = ReflectionUtils.findField(clzz, fieldName);
if (field != null) {
return true;
}
return false;
}
四、总结
1、ReflectionUtils 工具类:位于 spring-core 包,完整包名是:org.springframework.util.ReflectionUtils 。
2、ReflectionUtils.findField() 方法能获取到父类的私有属性,原理也是很简单的:
参考资料:
getFields和 getDeclaredFields 方法的区别